一.泛型递归
数的题目一般都是使用树来解决的,因为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皇后以及数独上面