递归的使用条件:
存在一个递归调用的终止条件;
每次递归的调用必须越来越靠近这个条件;只有这样递归才会终止,否则是不能使用递归的!
总之,在你使用递归来处理问题之前必须首先考虑使用递归带来的好处是否能补偿
他所带来的代价!否则,使用迭代算法会比递归算法要高效。
递归的基本原理:
1 每一次函数调用都会有一次返回.当程序流执行到某一级递归的结尾处时,它会转移到前一级递归继续执行.
2 递归函数中,位于递归调用前的语句和各级被调函数具有相同的顺序.如打印语句 #1 位于递归调用语句前,它按照递归调用的顺序被执行了 4 次.
3 每一级的函数调用都有自己的局部变量.
4 递归函数中,位于递归调用语句后的语句的执行顺序和各个被调用函数的顺序相反.
即位于递归函数入口前的语句,右外往里执行;位于递归函数入口后面的语句,由里往外执行。
5 虽然每一级递归有自己的变量,但是函数代码并不会得到复制.
6 递归函数中必须包含可以终止递归调用的语句.
一旦你理解了递归(理解递归,关键是脑中有一幅代码的图片,函数执行到递归函数入口时,就扩充一段完全一样的代码,执行完扩充的代码并return后,继续执行前一次递归函数中递归函数入口后面的代码),阅读递归函数最容易的方法不是纠缠于它的执行过程,而是相信递归函数会顺利完成它的任务。如果你的每个步骤正确无误,你的限制条件设置正确,并且每次调用之后更接近限制条件,递归函数总是能正确的完成任务。
不算递归调用语句本身,到目前为止所执行的语句只是除法运算以及对quotient的值进行测试。由于递归调用这些语句重复执行,所以它的效果类似循环:当quotient的值非零时,把它的值作为初始值重新开始循环。但是,递归调用将会保存一些信息(这点与循环不同),也就好是保存在堆栈中的变量值。这些信息很快就会变得非常重要。
斐波那契数是典型的递归案例:
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.确定边界(终了)条件
参考网址:
http://www.cnblogs.com/zhangqqqf/archive/2008/09/12/1289730.html //包含汉诺塔问题
http://dev.yesky.com/171/3064671.shtml
http://www.ibm.com/developerworks/cn/linux/l-recurs.html //IBM
http://baike.baidu.com/view/96473.htm#2 //包含习题
http://www.rupeng.com/forum/thread-19296-1-1.html
http://blog.csdn.net/ysuncn/archive/2007/09/21/1793896.aspx
http://www.rupeng.com/forum/thread-19241-1-1.html
来源:https://www.cnblogs.com/jnje/archive/2011/04/09/2010637.html