深究遞迴和迭代的區別、聯絡、優缺點及例項對比
http://blog.csdn.net/laoyang360/article/details/7855860
1.概念區分
遞迴的基本概念:程式呼叫自身的程式設計技巧稱為遞迴,是函式自己呼叫自己.
一個函式在其定義中直接或間接呼叫自身的一種方法,它通常把一個大型的複雜的問題轉化為一個與原問題相似的規模較小的問題來解決,可以極大的減少程式碼量.遞迴的能力在於用有限的語句來定義物件的無限集合.
使用遞迴要注意的有兩點:
1)遞迴就是在過程或函式裡面呼叫自身;
2)在使用遞迴時,必須有一個明確的遞迴結束條件,稱為遞迴出口.
遞迴分為兩個階段:
1)遞推:把複雜的問題的求解推到比原問題簡單一些的問題的求解;
2)迴歸:當獲得最簡單的情況後,逐步返回,依次得到複雜的解.
利用遞迴可以解決很多問題:如揹包問題,漢諾塔問題,...等.
斐波那契數列為:0,1,1,2,3,5...
由於遞迴引起一系列的函式呼叫,並且有可能會有一系列的重複計算,遞迴演算法的執行效率相對較低.
迭代:利用變數的原值推算出變數的一個新值.如果遞迴是自己呼叫自己的話,迭代就是A不停的呼叫B.
2.辯證看遞迴和迭代
所謂遞迴,簡而言之就是應用程式自身呼叫自身,以實現層次資料結構的查詢和訪問。遞迴的使用可以使程式碼更簡潔清晰,可讀性更好(對於初學者到不見得),但由於遞迴需要系統堆疊,所以空間消耗要比非遞迴程式碼要大很多,而且,如果遞迴深度太大,可能系統資源會不夠用。
往往有這樣的觀點:能不用遞迴就不用遞迴,遞迴都可以用迭代來代替。
誠然,在理論上,遞迴和迭代在時間複雜度方面是等價的(在不考慮函式呼叫開銷和函式呼叫產生的堆疊開銷),但實際上遞迴確實效率比迭代低,既然這樣,遞迴沒有任何優勢,那麼是不是就,沒有使用遞迴的必要了,那遞迴的存在有何意義呢?
萬物的存在是需要時間的檢驗的,遞迴沒有被歷史所埋沒,即有存在的理由。從理論上說,所有的遞迴函式都可以轉換為迭代函式,反之亦然,然而代價通常都是比較高的。但從演算法結構來說,遞迴宣告的結構並不總能夠轉換為迭代結構,原因在於結構的引申本身屬於遞迴的概念,用迭代的方法在設計初期根本無法實現,這就像動多型的東西並不總是可以用靜多型的方法實現一樣。這也是為什麼在結構設計時,通常採用遞迴的方式而不是採用迭代的方式的原因,一個極典型的例子類似於連結串列,使用遞迴定義及其簡單,但對於記憶體定義(陣列方式)其定義及呼叫處理說明就變得很晦澀,尤其是在遇到環鏈、圖、網格等問題時,使用迭代方式從描述到實現上都變得不現實。因而可以從實際上說,所有的迭代可以轉換為遞迴,但遞迴不一定可以轉換為迭代。
採用遞迴演算法需要的前提條件是,當且僅當一個存在預期的收斂時,才可採用遞迴演算法,否則,就不能使用遞迴演算法。
遞迴其實是方便了程式設計師難為了機器,遞迴可以通過數學公式很方便的轉換為程式。其優點就是易理解,容易程式設計。但遞迴是用棧機制實現的,每深入一層,都要佔去一塊棧資料區域,對巢狀層數深的一些演算法,遞迴會力不從心,空間上會以記憶體崩潰而告終,而且遞迴也帶來了大量的函式呼叫,這也有許多額外的時間開銷。所以在深度大時,它的時空性就不好了。
而迭代雖然效率高,執行時間只因迴圈次數增加而增加,沒什麼額外開銷,空間上也沒有什麼增加,但缺點就是不容易理解,編寫複雜問題時困難。
因而,“能不用遞迴就不用遞迴,遞迴都可以用迭代來代替”這樣的理解,還是辯證的來看待,不可一棍子打死。*/
1,2部分摘自網路,略有改動,向原作者致敬!
3.個人總結
|
定義 |
優點 |
缺點 |
遞迴 |
程式呼叫自身的程式設計技巧稱為遞迴 |
1)大問題化為小問題,可以極大的減少程式碼量; 2)用有限的語句來定義物件的無限集合.; 3)程式碼更簡潔清晰,可讀性更好 |
1)遞迴呼叫函式,浪費空間; 2)遞迴太深容易造成堆疊的溢位;
|
迭代 |
利用變數的原值推算出變數的一個新值,迭代就是A不停的呼叫B. |
1)迭代效率高,執行時間只因迴圈次數增加而增加; 2)沒什麼額外開銷,空間上也沒有什麼增加, |
1) 不容易理解; 2) 程式碼不如遞迴簡潔; 3) 編寫複雜問題時困難。 |
二者關系 |
1) 遞迴中一定有迭代,但是迭代中不一定有遞迴,大部分可以相互轉換。 2) 能用迭代的不用遞迴,遞迴呼叫函式,浪費空間,並且遞迴太深容易造成堆疊的溢位./*相對*/ |
舉例如下:
相關文章
- 遞迴與迭代的聯絡以及優缺點(以c++為例)遞迴C++
- TCP和UDP的優缺點及區別TCPUDP
- DNS遞迴解析和迭代解析的區別-VeCloudDNS遞迴Cloud
- 跟你深入剖析可迭代物件和迭代器的區別與聯絡物件
- Python: 列表、陣列及迭代器切片的區別及聯絡Python陣列
- memcached 和 redis 使用場景及優缺點對比Redis
- mixins和元件的區別和優缺點元件
- 對遞迴和迭代的效率的思考和分析遞迴
- Linux系統中多程式和多執行緒的優缺點及聯絡!Linux執行緒
- 淺談DNS遞迴解析和迭代解析之間的區別DNS遞迴
- 【知識點】 gcc和g++的聯絡和區別GC
- Nginx/Tomcat/Apache的優缺點和區別NginxTomcatApache
- 宏旺半導體分析EEPROM和FLASH的區別及各自的優缺點
- epic和steam的區別介紹及優劣對比
- 什麼是BSS/OSS,及區別和聯絡
- tcp/ip和http的區別和聯絡TCPHTTP
- orcle pfile和spfile的區別和聯絡
- NET|Ref 和out 的區別和聯絡
- Instruction和Question的區別和聯絡Struct
- http、socket、tcp的區別和聯絡?HTTPTCP
- SCADA和PLC的區別聯絡
- Session和Cookie的聯絡與區別SessionCookie
- CGI與Servlet的區別和聯絡Servlet
- Session和Cookie的區別與聯絡SessionCookie
- Java單例模式:缺點和優點Java單例模式
- 各大程式語言優缺點對比
- 詳細解讀:不同RAID級別的優缺點對比AI
- 轉:IDOCBAPIRFC區別和聯絡API
- Socket 與 Http區別 優缺點及應用場景HTTP
- Oracle中User和Schema的區別和聯絡Oracle
- 詳解CALayer 和 UIView的區別和聯絡UIView
- Comparator and Comparable 及Collections and Collection 的區別及聯絡?
- Jdk、Jre Jvm的區別和聯絡JDKJVM
- Linux和Ubuntu的區別與聯絡LinuxUbuntu
- SQL、NoSQL和NewSQL的優缺點比較SQL
- [轉]Apache與Tomcat 區別及聯絡ApacheTomcat
- 6 大主流 Web 框架優缺點對比Web框架
- 主流Jquery彈出框優缺點對比jQuery