深入理解递归
大家都知道,递归的本质和栈数据的存取很相似了,都是先进去,但是往往最后处理!再者对于递归函数的局部变量的存储是按照栈的方式去存的,对于每一层的递归函数在栈中都保存了本层函数的局部变量,一边该层递归函数结束时能够保存原来该层的数据!如图:
如上图递归式依次往下进行的,并且在该层递归函数还没结束即将进入下一层递归调用时,将会把该层函数中的局部变量保存起来,以供下次使用!
好了,以上是递归函数的数据存储方式,可是有时候我们又得抓头了,递归的话,有时候又很难理解,貌似总也想不通!
于是我又把每一层递归函数化分为三部分了,第一部分:是递归调用前的一些数据处理,判断以及递归结束判断(当然了结束条件肯定在递归调用前,要不每次递归就不会结束了),第二部分:就是递归函数本身了。而第三部分:当然就是递归函数的后续处理代码了!在这里我想我们得想明白一件事情了,每一层的函数都是在上一层递归函数结束时才返回的然后接着处理该层递归函数剩下的部分!例如如下代码:
Fib(0) = 0 [基本情况] Fib(1) = 1 [基本情况]
对所有n > 1的整数:Fib(n) = (Fib(n-1) + Fib(n-2)) [递归定义]
递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。(树的遍历,图的搜索)
如:
procedure a;
begin
a;
end;
这种方式是直接调用.
又如:
procedure b;
begin
c;
end;
procedure c;
begin
b;
end;
这种方式是间接调用.
如何设计递归算法
1.确定递归公式
2.确定边界(终了)条件
Ref:
http://blog.csdn.net/zp032420/article/details/7422158
http://www.cnblogs.com/jnje/archive/2011/04/09/2010637.html