数据结构与算法之算法

roseying 2020-01-31

递归

递归需要满足的三个条件

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

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

3. 存在递归终止条件

假如这里有 n 个台阶,每次你可以跨 1 个台阶或者 2 个台阶,请问走这 n 个台阶有多少种 走法?如果有 7 个台阶,你可以 2,2,2,1 这样子上去,也可以 1,2,1,1,2 这样子 上去,总之走法有很多,那如何用编程求得总共有多少种走法呢?
#
所以当 n个台阶的总走法是 是 f(n-1)个走法  + f(n-2)个走法
f(n) =f(n-1) +f(n-2)
因此,编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一 层层的调用关系,不要试图用人脑去分解递归的每个步骤。

递归代码要警惕堆栈溢出

递归代码要警惕重复计算

怎么将递归代码改写为非递归代码?

那是不是所有的递归代码都可以改为这种迭代循环的非递归写法呢?
笼统地讲,是的。因为递归本身就是借助栈来实现的,只不过我们使用的栈是系统或者虚拟 机本身提供的,我们没有感知罢了。如果我们自己在内存堆上实现栈,手动模拟入栈、出栈 过程,这样任何递归代码都可以改写成看上去不是递归代码的样子。

相关推荐