问题:树的解法一般使用递归的原因是什么?
- 它的结点和树的本身的数据结构的定义就是用递归的方式进行的。
- 不仅是树本身、二叉树、以及二叉搜索树,在定义数据结构和算法特性的时候,也是有所谓的重复性(自相似性)。
一、递归(Recursion)
递归-循环(通过函数体来进行的循环)
计算机语言在创造的时候,本质上就是汇编,汇编有个特点:没有循环嵌套,只是反复跳到之前的那段指令,不断的执行
采用递归方式的电影
- 向下进入到不同梦境中;向上又回到原来一层,--- > “归去来兮”
- 通过声音同步回到上一层, ---> 用参数来进行函数不同层之间的传递变量。
- 每一层的环境和周围的人都是一份拷贝、主角等几个人穿越不同层级的梦境(发生和携带变化)
示例:
# 计算 n!
递归栈
这种形式更像一种“剥洋葱”的形式,类似于一个栈的形式,一层一层进去,然后剥开。而栈就是递归调用的时候,系统给我们做了一个这样的调用栈。
二、递归代码模板(重点记下来)
Python实现
def
Java实现
public
- 递归终止条件(terminator):写递归函数开始的话,一定要先把函数递归终止条件写上,否则,会导致无限递归或者死循环。
- 处理当前层的逻辑(current level logic):完成这一层要进行的业务代码、逻辑代码
- 下探到下一层(drill down):这里的参数来标记当前是哪一层,这里level必须加1,同时把相应的参数p1、p2、p3...放下去就行了。
- 清理(reverse):递归完了,有些东西可能要清理,(非必需)
三、思维要点
- 不要人肉进行递归(最大误区),初学者可以在纸上画出递归的状态树,慢慢熟练之后一定要抛弃这样的习惯。一定要记住:直接看函数本身开始写即可。否则,永远没办法掌握、熟练使用递归。
- 找到最近最简的方法,将其拆解成可重复解决的问题(找最近重复子问题)。原因是我们写的程序的指令,只包括 if else 、 for 和 while loop、递归调用。
- 数学归纳法的思维,最开始最简单的条件是成立的,比如n=1,n=2的时候是成立的,且第二点你能证明当n成立的时候,可以推导出n+1也成立的。
示例:
leetcode -70. 爬楼梯leetcode-cn.com
class
leetcode - 22. 括号生成leetcode-cn.com
class