標籤: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使用者棧是使用者進程空間中的一塊地區,用於儲存使用者進程的子程式間相互調用的參數、傳回值、返回點以及子程式(函數)的局部變數。
我們編寫的遞迴程式屬於使用者程式,因此使用的是使用者棧。
資料結構與演算法 —— 遞迴的效率問題以及遞迴與迴圈的比較