java 递归 continue 死循环 java递归和循环区别_递归调用


问题:树的解法一般使用递归的原因是什么?

  1. 它的结点和树的本身的数据结构的定义就是用递归的方式进行的。
  2. 不仅是树本身、二叉树、以及二叉搜索树,在定义数据结构和算法特性的时候,也是有所谓的重复性(自相似性)


java 递归 continue 死循环 java递归和循环区别_数据结构_02


一、递归(Recursion)

递归-循环(通过函数体来进行的循环)

计算机语言在创造的时候,本质上就是汇编,汇编有个特点:没有循环嵌套,只是反复跳到之前的那段指令,不断的执行


java 递归 continue 死循环 java递归和循环区别_java 全局变量 跳出递归循环_03

采用递归方式的电影

  • 向下进入到不同梦境中;向上又回到原来一层,--- > “归去来兮”
  • 通过声音同步回到上一层, ---> 用参数来进行函数不同层之间的传递变量。
  • 每一层的环境和周围的人都是一份拷贝、主角等几个人穿越不同层级的梦境(发生和携带变化)

示例:


# 计算 n!


java 递归 continue 死循环 java递归和循环区别_数据结构_04

递归栈

这种形式更像一种“剥洋葱”的形式,类似于一个栈的形式,一层一层进去,然后剥开。而栈就是递归调用的时候,系统给我们做了一个这样的调用栈。

二、递归代码模板(重点记下来)

Python实现


def


Java实现


public


  1. 递归终止条件(terminator):写递归函数开始的话,一定要先把函数递归终止条件写上,否则,会导致无限递归或者死循环。
  2. 处理当前层的逻辑(current level logic):完成这一层要进行的业务代码、逻辑代码
  3. 下探到下一层(drill down):这里的参数来标记当前是哪一层,这里level必须加1,同时把相应的参数p1、p2、p3...放下去就行了。
  4. 清理(reverse):递归完了,有些东西可能要清理,(非必需)

三、思维要点

  1. 不要人肉进行递归(最大误区),初学者可以在纸上画出递归的状态树,慢慢熟练之后一定要抛弃这样的习惯。一定要记住:直接看函数本身开始写即可。否则,永远没办法掌握、熟练使用递归。
  2. 找到最近最简的方法,将其拆解成可重复解决的问题(找最近重复子问题)。原因是我们写的程序的指令,只包括 if else 、 for 和 while loop、递归调用。
  3. 数学归纳法的思维,最开始最简单的条件是成立的,比如n=1,n=2的时候是成立的,且第二点你能证明当n成立的时候,可以推导出n+1也成立的。

示例:

leetcode -70. 爬楼梯leetcode-cn.com

class

leetcode - 22. 括号生成leetcode-cn.com

class