資料結構與演算法 —— 遞迴的效率問題以及遞迴與迴圈的比較

來源:互聯網
上載者:User

標籤:htm   操作   div   資料結構與演算法   參數傳遞   包括   post   原因   代碼   

1.所謂的遞迴慢到底是什麼原因呢?

大家都知道遞迴的實現是通過調用函數本身,函數調用的時候,每次調用時要做地址儲存,參數傳遞等,這是通過一個遞迴工作棧實現的。具體是每次調用函數本身要儲存的內容包括:局部變數、形參、調用函數地址、傳回值。那麼,如果遞迴調用N次,就要分配N*局部變數、N*形參、N*調用函數地址、N*傳回值。從而導致了效率的低下。

 

2.用迴圈效率會比遞迴效率高嗎?

遞迴與迴圈是兩種不同的解決問題的典型思路。當然也並不是說迴圈效率就一定比遞迴高,遞迴和迴圈是兩碼事,遞迴帶有棧操作,迴圈則不一定,兩個概念不是一個層次,不同情境做不同的嘗試。

2.1遞迴演算法:

優點:代碼簡潔、清晰,並且容易驗證正確性。(如果你真的理解了演算法的話,否則你更暈)

缺點:它的運行需要較多次數的函數調用,如果調用層數比較深,需要增加額外的堆棧處理(還有可能出現堆疊溢位的情況),比如參數傳遞需要壓棧等操作,會對執行效率有一定影響。但是,對於某些問題,如果不使用遞迴,那將是極端難看的代碼。

2.2迴圈演算法:

優點:速度快,結構簡單。

缺點:並不能解決所有的問題。有的問題適合使用遞迴而不是迴圈。如果使用迴圈並不困難的話,最好使用迴圈。

2.3遞迴演算法和迴圈演算法總結:

1. 一般遞迴調用可以處理的演算法,也通過迴圈去解決常需要額外的低效處理。

2. 現在的編譯器在最佳化後,對於多次調用的函數處理會有非常好的效率最佳化,效率未必低於迴圈。

3.遞迴和迴圈兩者完全可以互換。如果用到遞迴的地方可以很方便使用迴圈替換,而不影響程式的閱讀,那麼替換成遞迴往往是好的。(例如:求階乘的遞迴實現與迴圈實現。)

 

3.那麼遞迴使用的棧是什麼樣的一個棧呢?

首先,看一下系統棧和使用者棧的用途。

3.1系統棧(也叫核心棧、核心棧)是記憶體中屬於作業系統空間的一塊地區,其主要用途為: (1)儲存中斷現場,對於嵌套中斷,被中斷程式的現場資訊依次壓入系統棧,中斷返回時逆序彈出; (2)儲存作業系統子程式間相互調用的參數、傳回值、返回點以及子程式(函數)的局部變數。

3.2使用者棧是使用者進程空間中的一塊地區,用於儲存使用者進程的子程式間相互調用的參數、傳回值、返回點以及子程式(函數)的局部變數。

我們編寫的遞迴程式屬於使用者程式,因此使用的是使用者棧。

 

資料結構與演算法 —— 遞迴的效率問題以及遞迴與迴圈的比較

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.