递归简介

  • 递归头:什么时候不调用自己方法,即递归的结束条件
  • 递归体:什么时候需要调用自己方法,即自己调用自己
  1. public static void method() {
  2. if (count++ < 10) {// 递归体
  3. System.out.println("测试递归");
  4. method();// 调用方法自己就叫递归
  5. } else {// 递归头
  6. return;// 小提示:return除了用于返回值以外,还有结束程序的功能哦
  7. }
  8. }
  • 优点:将问题逐渐简单化,例如计算阶乘
  • 缺点:会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度比循环慢的多。

递归需要满足的三个条件


  • 一个问题的解可以分解为几个子问题的解
  • 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
  • 存在递归终止条件

写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。

递归的本质

递归,实际上是帮我们维护了栈的数据结构,因此,所有的递归都能通过循环来实现。
递归的调用链路,其实就是一颗数,递归体包含对自身的调用次数等于数的分支数。


递归注意事项

警惕堆栈溢出

警惕重复计算
image.png

警惕脏数据导致递归无法结束

递归是借助栈本身来实现的,笼统的讲,所有的递归都可以使用迭代循环来实现。