递归、迭代和分治法
一、递归算法:直接或间接地调用自身的算法。
1、使用递归要注意的有两点:
- 递归就是在过程或函数里面调用自身;
- 在使用递归时,必须有一个明确的递归结束条件,称为递归出口.
2、递归分为两个阶段:
- 递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;
- 回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.
利用递归可以解决很多问题:如背包问题,汉诺塔问题,...等.
3、优缺点
- 优点:结构清晰,可读性强,且容易用数学归纳法证明算法的正确性。
- 缺点:(1) 递归算法需要调用递归栈存放函数的变量、计算结果等直至return后才会释放该栈,所以消耗内存空间;
(2) 可能存在重复计算相同的子问题。
二、分治法:将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同,然后递归地解这些子问题,
最后将各个子问题的解合并得到原问题的接。
应用:二分搜索、大整数乘法。
三、迭代:利用变量的原值推算出变量的一个新值。
四、递归和迭代的区别:
通过斐波那契数列为例:
F(0)=1; n = 0
F(n) = F(1)=1; n = 1
F(n)=F(n-1)+F(n-2); n > 1
//递归实现 int fib(int n){ if(n>1) return fib(n-1) + fib(n-2); else return 1; // n = 0, 1时给出recursion终止条件 } //迭代实现 int fib(int n){ int i, temp0, temp1, temp2; if(n<=1) return 1; temp1 = 0; temp2 = 1; for(i = 2; i <= n; i++){ temp0 = temp1 + temp2; temp2 = temp1; temp1 = temp0; } return temp0; }