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