遞歸與while循環的區別

1、引入

說起循環,我們大多會想到“遞歸、迭代、遍歷”等幾個詞,具體的含義請看本文附錄。今天只結合具體例子說一說遞歸和while循環的比較。

兩者的代碼比較

問:求1+2+3+…+n的和,請用兩種方法寫出代碼?

答:遞歸代碼:

 public static int Fun(int n){  

    if(n == 1){  

        return 1;  

    }  

    else {  

        return n + Fun(n-1);  

    }  

} 

while循環代碼:

public class me{

public static void main(String[] args){

int sum=0;

int i=1;

while(i<=n){

sum+=i;

i++;

}

System.Out.println("sum="+sum);

2、兩者的概念比較

2-1、遞歸(recursion)

在函數內調用自身,將複雜情況逐步轉化成基本情況。有網友說:遞歸就是包子餡包子,它的極限就是饅頭。仔細想想,哈哈,就是這麼個理兒。遞歸分爲線性遞歸和尾遞歸。

舉個栗子,已知f(2)=3,f(n)=f(n-1)+n,求f(5)?

答:f(5)=f(4)+5=f(3)+4+5=f(2)+3+4+5=15

這裏的f(2)就是基線條件,這似乎就是人們所說的“出口”。基線條件就是函數沒必要再循環下去了。

在這裏插入圖片描述

2-2、循環(loop)

在滿足條件的情況下,重複執行同一段代碼,比如while語句。

這個簡單,不再贅述。

綜上。看到一個網友這樣描述兩者:遞歸就像小明要去樓頂取東西,從一樓開始爬,看,不是的,繼續爬,每層樓梯看上去都一樣,但1到2,2到3的樓梯是兩個樓梯,等到了樓頂,取到東西,不能直接跳樓跳下來,還得從樓頂一層層退回來。

而while循環,就像驢子拉磨,無論跑多少次,都是在原地。變化的只是磨盤裏的磨的東西,而不是驢每圈所在的不同位置。

2-3、優缺點比較

方法 優點 缺點
遞歸 代碼更簡潔清晰,可讀性更好。 由於遞歸需要系統堆棧,所以空間消耗要比非遞歸代碼要大很多。而且,如果遞歸深度太大,可能系統撐不住。
循環 速度快,結構簡單 並不能解決所有的問題

2-4、使用範圍比較

循環能幹的事,遞歸都能幹;遞歸能幹的事,循環不一定能幹。如果使用循環並不困難的話,最好使用循環。

3、迭代和遍歷。

迭代(iterate):在數學中:在多次循環中逐步接近結果。

在編程中:按順序訪問一個列表中的每一項。適用於線性結構,如數組和隊列

遍歷(traversal):按規則訪問結構中的每一項,且每項只訪問一次。適用於非線性結構,如樹,圖。

在這裏插入圖片描述

4、參考

轉載自【算法】遞歸與while循環的區別:https://blog.csdn.net/Beyond_2016/article/details/81283054

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