递归需要满足的三个条件

1. 一个问题的解可以分解为几个问题的子解

2. 这个问题分解后的子问题,除了数据规模不同,求解思路完全一样

3. 存在递归终止条件

警惕堆栈溢出

函数调用时会使用栈来保存临时变量,如果递归求解的数据规模很大,调用层次很深,一直压入栈,则会有堆栈溢出的风险。
一般的做法是在代码中限制递归调用的最大深度,超过预设值,则返回错误。
因此,在选用递归时,需要对递归调用的深度有预判,超过一定的深度值,则不适合用递归调用的方式。

警惕重复计算

例如下列公式:

  1. f(n) = f(n-1) + 1

当前值的计算依赖于上一个值,例如,计算f(3)的值,依赖于f(2)f(1)的值,而在计算f(4)的值时,依赖于f(3)f(2)f(1)的值,如果每次计算时,都重新求解前序值,则会造成过多的重复计算,影响计算效率。此时,可以将已求解的值暂存起来,每次计算新的值时,可以先寻找所需的前序值是否已经计算过,计算过则直接使用,否则再利用公式进行计算。

结合迭代

笼统的讲,递归代码都可以改写为迭代循环的非递归形式的代码。