根據(jù)面向?qū)ο蟪绦蛟O(shè)計的思想,對象包括屬性(數(shù)據(jù))和方法(操作)。其實,遞歸和循環(huán)就相當于兩種非常相似的操作,但是它們都有適合自己操作的數(shù)據(jù)??梢园岩粋€問題看作一個對象,問題由數(shù)據(jù)(問題沒有解決時的狀態(tài)或數(shù)據(jù)結(jié)構(gòu))和操作(把問題解決)組成。根據(jù)不同的數(shù)據(jù)(數(shù)據(jù)結(jié)構(gòu)——> 問題結(jié)構(gòu)),選擇相應(yīng)的操作,才是合適的選擇! 相同點:
不同點:
遞歸由程序和系統(tǒng)共同完成。遞歸需要系統(tǒng)維護一個系統(tǒng)工作棧。 循環(huán)由程序單獨完成。但是,循環(huán)需要程序設(shè)定好循環(huán)條件。
遞歸的規(guī)模很小,受到系統(tǒng)工作棧大小的限制。 循環(huán)的規(guī)模很大,幾乎不會受到限制。 在VS2012中計算1+2+3+······+n 使用遞歸n只能達到4710. 使用循環(huán)n可以達到20 0000 0000.
遞歸的復(fù)用單位是函數(shù)。 循環(huán)的復(fù)用單位是語句(for循環(huán)語句或while循環(huán)語句)。
遞歸往往是自頂向下(1 <—— n),將問題的規(guī)模逐步縮小,直到縮小至遞歸結(jié)束條件成立(n == 1)。 循環(huán)既可以是自頂向下(1 <—— n),也可以是自底向上(1 ——> n),但是一般還是自底向上(1——> n)的比較多。 3.5.優(yōu)缺點 3.5.1遞歸的優(yōu)點: 代碼清晰簡潔,易于理解,可讀性強。 3.5.2遞歸的缺點: 運行效率低(函數(shù)調(diào)用需要參數(shù)入 棧和出棧); 對存儲空間的占用比循環(huán)多,因此受到問題規(guī)模和線程空間大小的限制,如果棧溢出,將導(dǎo)致系統(tǒng)崩潰; 不便于調(diào)試。 3.5.3循環(huán)的優(yōu)點: 運行效率高(不需要函數(shù)參數(shù)入棧和出棧); 對存儲空間占用比遞歸少,不需要系統(tǒng)維護工作棧; 便于調(diào)試。 3.5.4循環(huán)的缺點: 一重,二重,三重循環(huán)還能接受,四重以上循環(huán)的代碼就變得非常難看,可讀性很差。而且有的問題非常適合用遞歸,用循環(huán)實現(xiàn)非常難。 3.6適用場合 遞歸適合用在: 數(shù)據(jù)的結(jié)構(gòu)形式是按照遞歸定義的,比如單鏈表,二叉樹,斐波那契數(shù)列等; 數(shù)據(jù)的結(jié)構(gòu)形式不是按照遞歸定義的,但是用遞歸求解比用循環(huán)求解更加簡單,比如漢諾塔問題,四重及以上循環(huán)問題。 循環(huán)適合用在: 數(shù)據(jù)的結(jié)構(gòu)形式不是按照遞歸定義的,使用循環(huán)就能夠輕松解決的問題,比如一重循環(huán)、二重循環(huán)、三重循環(huán)。 由于循環(huán)具有運行效率高,便于調(diào)試等優(yōu)點,因此盡量使用循環(huán)。但是,當遇到如上面所示的兩種適合遞歸的問題或者循環(huán)很難解決的問題時,就要使用遞歸。雖然使用遞歸犧牲了運行效率和存儲空間,但是卻換來了更加清晰簡潔和易于理解的代碼,可讀性大大提高! 主編:王楠嵐 |
|