循環、遞歸、迭代、遍歷

/////////////////////////////////////////////////////////////////////////////////////

表示“重複”這個含義的詞有很多, 比如循環(loop), 遞歸(recursion), 遍歷(traversal), 迭代(iterate).

循環算是最基礎的概念, 凡是重複執行一段代碼, 都可以稱之爲循環. 大部分的遞歸, 遍歷, 迭代, 都是循環.

遞歸的定義是, 根據一種(幾種)基本情況定義的算法, 其他複雜情況都可以被逐步還原爲基本情況.
在編程中的特徵就是, 在函數定義內重複調用該函數.
例如斐波那契數列, 定義F(0)=1, F(1)=1, 所有其他情況: F(x)=F(x-1)+F(x-2). 所有大於1的整數經過有限次的反推之後都可以轉換到兩種基本情況. 而在編程中, 算法則是這樣的:

int F(x)
{
    if(x==0 || x==1)
        return 1;    //這裏是退出遞歸的條件, 以保證在有限次遞歸後能夠得到結果
    return F(x-1)+F(x-2);    //轉化爲更爲基本的情況, 重複調用自身進行計算
}

迭代在數學和編程中有不同的含義.迭代(數學): 在循環的基礎上, 每一次循環, 都比上一次更爲接近結果.
例如下面是一個迭代的例子.

int result = 0;
for(int i=0; i<10; i++)
    result += i;    //每一次循環之後, result都更加接近結果45

有很多數學問題, 都是迭代算法, 如牛頓迭代法(求平方根).

迭代(編程): 按順序訪問一個列表中的每一項, 在很多編程語言中表現爲foreach語句:

$arr = [1, 2, 3, 4];
foreach($arr as $i)
    echo $i;

遍歷: 按一定規則訪問一個非線性的結構中的每一項, 強調非線性結構(樹, 圖). 而迭代一般適用於線性結構(數組, 隊列).

結論

  • 循環(loop) - 最基礎的概念, 所有重複的行爲
  • 遞歸(recursion) - 在函數內調用自身, 將複雜情況逐步轉化成基本情況
  • (數學)迭代(iterate) - 在多次循環中逐步接近結果
  • (編程)迭代(iterate) - 按順序訪問線性結構中的每一項
  • 遍歷(traversal) - 按規則訪問非線性結構中的每一項

////////////////////////////////////////////////////////////////////////////////////////////

遞歸與迭代的區別聯繫

////////////////////////////////////////////////////////////////////////////////////////////

遞歸的基本概念:程序調用自身的編程技巧稱爲遞歸,是函數自己調用自己.

一個函數在其定義中直接或間接調用自身的一種方法,它通常把一個大型的複雜的問題轉化爲一個與原問題相似的規模較小的問題來解決,可以極大的減少代碼量.遞歸的能力在於用有限的語句來定義對象的無限集合.

使用遞歸要注意的有兩點:

1)遞歸就是在過程或函數裏面調用自身;

2)在使用遞歸時,必須有一個明確的遞歸結束條件,稱爲遞歸出口.

 

遞歸分爲兩個階段:

1)遞推:把複雜的問題的求解推到比原問題簡單一些的問題的求解;

2)迴歸:當獲得最簡單的情況後,逐步返回,依次得到複雜的解.

 

利用遞歸可以解決很多問題:如揹包問題,漢諾塔問題,...等.

斐波那契數列爲:0,1,1,2,3,5...

fib(0)=0;

fib(1)=1;

fib(n)=fib(n-1)+fib(n-2);

上面就是一個簡單的遞歸調用了.由於遞歸引起一系列的函數調用,並且有可能會有一系列的重複計算,遞歸算法的執行效率相對較低.

 

 

迭代:利用變量的原值推算出變量的一個新值.如果遞歸是自己調用自己的話,迭代就是A不停的調用B.

遞歸中一定有迭代,但是迭代中不一定有遞歸,大部分可以相互轉換.能用迭代的不用遞歸,遞歸調用函數,浪費空間,並且遞歸太深容易造成堆棧的溢出.

    //這是遞歸  
    int funcA(int n)  
    {  
        if(n > 1)  
           return n+funcA(n-1);  
        else   
           return 1;  
    }  
    //這是迭代  
    int funcB(int n)  
    {  
        int i,s=0;  
        for(i=1;i<n;i++)  
           s+=i;  
        return s;  
    }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章