算法第三周_泛型递归,树的递归,分治回溯

一.泛型递归

数的题目一般都是使用树来解决的,因为1.数的定义使用的就是递归的方式进行的,2.重复性
递归本质上是一种循环,是函数体调用自身来重复

使用盗梦空间来理解递归

在这里插入图片描述

递归python代码模板:

在这里插入图片描述
模板分为四个部分:
第一部分:递归终止条件
一般就是递归到了最下面的叶子层级(叶子节点)的子问题没有了
第二部分:处理当前层逻辑
一般就是看怎么把一个大问题分成子问题
第三部分:下探到下一层
第四部分:清理当前层,通常是不用清理的,但是有时候比如全局变量就需要清理

思维要点:

在这里插入图片描述
1.刚开始可以在纸上画一画递归树,后年的话要直接能够写函数,这样才能更好的掌握递归。
3.归纳n=1时成立,n=2时成立,从n成立能推导出n+1也成立;

二.分治和回溯

分治和回溯本质上就是递归,遇到一个问题要去找其重复性,重复性有最近重复性和最优重复性,最优重复性就是动态规划,最近重复性:根据重复性怎么构造以及怎么分解就有分治或者回溯等各种办法
不管是递归,分治,回溯本质上都是找重复性以及分解问题和组合子问题的问题

分治模板:

在这里插入图片描述
和泛型递归模板是一样的,只有一点区别,就是增加倒数第二步中将子问题合并成一个大问题;

分治template

1.terminator–>2.process(split your big problem)–>3.drill down(subproblems),merge(subsult)–>4.reverse states
case:
power(x,n)理解分治思想:power(x,n)

#分治思路:
#pow(x,n):
#	subproblem pow(x,n/2)
#if n%2 ==1:
#	result = subresult *subresult*x
#else:
#	result = subresult *subresult
#代码:
class Solution:
    def myPow(self, x: float, n: int) -> float:
        def quikenum(N):
            if N == 0:
                return 1.0
            y = quikenum(N//2)  #y指向最终结果的中间位置
            return y*y if N%2 == 0 else y*y*x #如果n为偶数,最终结果是y*y,如果是奇数得再乘以一个x
        return quikenum(n) if n>0 else (1.0/quikenum(-n))  #如果n为负数,按照-n计算再求倒数

回溯

在这里插入图片描述
意思就是在每一层有不同的办法,然后每一层一个一个试,典型应用:N皇后以及数独上面

猜你喜欢

转载自blog.csdn.net/a18829292719/article/details/111416318