遞歸、迭代和分治法


一、遞歸算法:直接或間接地調用自身的算法。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM