(一)概述:
根據面向對象程序設計的思想,對象包括屬性(數據)和方法(操作)。其實,遞歸和循環就相當於兩種非常相似的操作,但是它們都有適合自己操作的數據。可以把一個問題看作一個對象,問題由數據(問題沒有解決時的狀態或數據結構)和操作(把問題解決)組成。根據不同的數據(數據結構——> 問題結構),選擇相應的操作,才是合適的選擇!
(二)相同點:
(1.遞歸和循環的本質都是代碼復用。
(2.遞歸和循環在理論上具有相同的計算能力(在可計算性理論中,這兩種計算模型所計算的函數類是相同的)。
(3.遞歸是一種特殊的循環。
(三)不同點:
1.程序獨立性
遞歸由程序和系統共同完成。遞歸需要系統維護一個系統工作棧。
循環由程序單獨完成。但是,循環需要程序設定好循環條件。
2.程序規模
遞歸的規模很小,受到系統工作棧大小的限制。
循環的規模很大,幾乎不會受到限制。
在VS2012中計算1+2+3+······+n
使用遞歸n只能達到4710.
使用循環n可以達到20 0000 0000.
3.復用單位
遞歸的復用單位是函數。
循環的復用單位是語句(for循環語句或while循環語句)。
4.解題方向
遞歸往往是自頂向下(1 <—— n),將問題的規模逐步縮小,直到縮小至遞歸結束條件成立(n == 1)。
循環既可以是自頂向下(1 <—— n),也可以是自底向上(1 ——> n),但是一般還是自底向上(1 ——> n)的比較多。
5.優缺點
(1)遞歸的優點:
代碼清晰簡潔,易於理解,可讀性強。
(2)遞歸的缺點:
運行效率低(函數調用需要參數入 棧和出棧);
對存儲空間的占用比循環多,因此受到問題規模和線程空間大小的限制,如果棧溢出,將導致系統崩潰;
不便於調試。
(3)循環的優點:
運行效率高(不需要函數參數入棧和出棧);
對存儲空間占用比遞歸少,不需要系統維護工作棧;
便於調試。
(4)循環的缺點:
一重、二重、三重循環的代碼還能接受,四重及以上循環的代碼就變得非常難看,可讀性很差。
而且有的問題非常適合用遞歸,用循環實現會非常困難。
6.適用場合
遞歸適合用在:
數據的結構形式是按照遞歸定義的,比如單鏈表,二叉樹,斐波那契數列等;
數據的結構形式不是按照遞歸定義的,但是用遞歸求解比用循環求解更加簡單,比如漢諾塔問題,四重及以上循環問題。
循環適合用在:
數據的結構形式不是按照遞歸定義的,使用循環就能夠輕松解決的問題,比如一重循環、二重循環、三重循環。
(四)結論:
由於循環具有運行效率高,便於調試等優點,因此盡量使用循環。但是,當遇到如上面所示的兩種適合遞歸的問題或者循環很難解決的問題時,就要使用遞歸。雖然使用遞歸犧牲了運行效率和存儲空間,但是卻換來了更加清晰簡潔和易於理解的代碼,可讀性大大提高!
轉載於 https://blog.csdn.net/uuuutaossienuuuu/article/details/50732185