递归及递归算法
给你讲个故事:古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐
其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先
致其知,致知在格物。物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,
身修而后家齐,家齐而后国治,国治而后天下平。
-------这就是早在中国的上千年前老祖宗的递归思想。
1,递归:递归分两步,递和归;通俗的说也就是自己调用自己,从下面这幅图就可以
看出,照片中的人拿到一直都是和自己完全一样的照片,那什么是递和归,又有什么特
点,为什么要递归呢?
递归之所以现在还存在是因为递归可以产生无限循环体,也就是说有可能产生100层
也可能10000层for循环。例如对于一个字符串进行全排列,字符串长度不定,那么如果
你用循环来实现,你会发现你根本写不出来,这个时候就要调用递归,而且在递归模型
里面还可以使用分支递归,例如for循环与递归嵌套,或者这节枚举几个递归步进表达
式,每一个形成一个递归。
2,递归(recursion):程序调用自身的编程技巧。
递归必须满足2个条件:
1)有反复执行的过程(调用自身)
2)有跳出反复执行过程的条件(递归出口)
3,递归一般用于解决三类问题:
(1)数据的定义是按递归定义的。(Fibonacci函数,n的阶乘)
(2)问题解法按递归实现。(回溯)
(3)数据的结构形式是按递归定义的。(二叉树的遍历,图的搜索)
4,什么是递归函数(recursive function)
递归函数即自调用函数,在函数体内部直接或间接地自己调用自己,即函数的嵌套调
用是函数本身。
例如,下面的程序为求n!:
<span style="font-size:24px;">long fact(int n)
{
if(n==1)
return 1;
return fact(n-1)*n; //出现函数自调用
}
</span>
经典的斐波那契数列:用线性递归实现Fibonacci函数,程序如下所示:
<span style="font-size:24px;"><span style="font-size:24px;">1 int FibonacciRecursive(int n)
2 {
3 if( n < 2)
4 return n;
5 return (FibonacciRecursive(n-1)+FibonacciRecursive(n-2));
6 }
</span>
</span>
5,小结:
递归最重要最重要的思想就是:分解,把大问题分解成小问题,把规模大的问题转
化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问
题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题
的函数必须有明显的结束条件,这样就不会产生无限递归的现象了。