递推算法——理性思维模式的代表,其原理是根据已有的数据和关系,逐步推导而得到结果。
算法的执行过程:
- 根据已知结果和关系,求解中间结果。
- 判定是否达到要求,未达到则继续重复第一步,直到寻找到正确答案。
递归算法——在程序中不断地反复调用自身来达到求解问题的方法,重点是调用自身。
编写递归方法时,必须使用if语句强制方法在未执行递归调用之前返回,如果不这样做,它将永远不会返回(这很重要)。
从理论上说,所有的递归函数都可以转换为循环函数,然而代价通常都是比较高的。但递归是用栈机制实现的(c++),每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。
递归调用分两种情况:
- 直接递归:就是指在方法调用方法本身。
- 间接递归:指在另一个方法中调用递归方法(如前面提到的图的遍历),间接递归用的不多。
递推与递归的区别:
- 从程序上看,递归表现为自己调用自己,递推则没有这样的形式。
- 一般来说,递推的效率高于递归
- 递归最终求得问题是逆向的,递推是从简单问题出发,一步步的向前发展,最终求得问题。是正向的。
代码实现:
实例:斐波拉契数列(兔子产仔问题)——一对两个月大的兔子以后每个月可以产仔一对,新生兔两个月后又可以产仔,也就是说,一月份出生,三月份才可以产仔,假定兔子没有死亡,问n月后兔子的数量;
分析:
- 第一个月:1对兔子;
- 第二个月:1对兔子;
- 第三个月:2对兔子;
- 第四个月:3对兔子;
- 第五个月:5对兔子;
- 即从第三个月开始,每个月的兔子对树等于前两个月的兔子数的总和;
递推算法求解:
// 递推算法实例——斐波拉契数列——兔子产仔问题(1,1,2,3,5,8,13...)
int diTui2(int n) {// n表示月份
int temp1, temp2, tempn;
temp1 = 1;// 两个月前的兔子对数
temp2 = 1;// 一个月前的兔子对数
tempn = 0;//n月的兔子对数
for (int i = 3; i <= n; i++) {
tempn = temp1 + temp2;
temp1 = temp2;
temp2 = tempn;
}
return tempn;
}
递归算法求解:
// 递归算法实例——斐波拉契数列——兔子产仔问题(1,1,2,3,5,8,13...)
int diTui(int n) {// n表示月份
int temp1, temp2;
if (n == 1 || n == 2) {
return 1;
} else {
temp1 = diTui(n - 1);// 一个月前的兔子对数
temp2 = diTui(n - 2);// 两个月前的兔子对数
return temp1 + temp2;
}
}
//递归算法实例——阶乘问题——如5!(5的阶乘)=5x4x3x2x1=120;
int diGui(int n){
if(n==1){
return 1;
}
return n*diGui(n-1);
}