递归简介
- 递归头:什么时候不调用自己方法,即递归的结束条件
- 递归体:什么时候需要调用自己方法,即自己调用自己
public static void method() {
if (count++ < 10) {// 递归体
System.out.println("测试递归");
method();// 调用方法自己就叫递归
} else {// 递归头
return;// 小提示:return除了用于返回值以外,还有结束程序的功能哦
}
}
- 优点:将问题逐渐简单化,例如计算阶乘
- 缺点:会占用大量的系统堆栈,内存耗用多,在递归调用层次多时速度比循环慢的多。
递归需要满足的三个条件
- 一个问题的解可以分解为几个子问题的解
- 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
- 存在递归终止条件
写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。
递归的本质
递归,实际上是帮我们维护了栈的数据结构,因此,所有的递归都能通过循环来实现。
递归的调用链路,其实就是一颗数,递归体包含对自身的调用次数等于数的分支数。
递归注意事项
警惕堆栈溢出
警惕重复计算
警惕脏数据导致递归无法结束
递归是借助栈本身来实现的,笼统的讲,所有的递归都可以使用迭代循环来实现。