递归需要满足的三个条件
1. 一个问题的解可以分解为几个问题的子解
2. 这个问题分解后的子问题,除了数据规模不同,求解思路完全一样
3. 存在递归终止条件
警惕堆栈溢出
函数调用时会使用栈来保存临时变量,如果递归求解的数据规模很大,调用层次很深,一直压入栈,则会有堆栈溢出的风险。
一般的做法是在代码中限制递归调用的最大深度,超过预设值,则返回错误。
因此,在选用递归时,需要对递归调用的深度有预判,超过一定的深度值,则不适合用递归调用的方式。
警惕重复计算
例如下列公式:
f(n) = f(n-1) + 1
当前值的计算依赖于上一个值,例如,计算f(3)的值,依赖于f(2)、f(1)的值,而在计算f(4)的值时,依赖于f(3)、f(2)、f(1)的值,如果每次计算时,都重新求解前序值,则会造成过多的重复计算,影响计算效率。此时,可以将已求解的值暂存起来,每次计算新的值时,可以先寻找所需的前序值是否已经计算过,计算过则直接使用,否则再利用公式进行计算。
结合迭代
笼统的讲,递归代码都可以改写为迭代循环的非递归形式的代码。
