递归、迭代和分治法

一、递归算法:直接或间接地调用自身的算法。

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;
}
View Code

 

posted @ 2018-04-15 21:58  JQS  阅读(2306)  评论(0编辑  收藏  举报