數據結構與算法:遞歸

1、什麼是遞歸

遞歸是一種應用很是普遍的算法(或者說編程技巧)。很短數據結構和算法的編碼實現都要用到遞歸,好比DFS深度優先搜索、先後中序二叉樹遍歷等等。算法

方法或者函數調用自身的方式稱爲遞歸調用,調用稱爲,返回稱爲編程

2、爲何使用遞歸

遞歸的優勢:代碼表達能力強,寫起來簡潔,執行起來高效。數據結構

遞歸的缺點:空間複雜度高、有堆棧溢出的風險、存在重複計算、過多的函數調用會耗時較多數據結構和算法

3、什麼樣的問題可使用遞歸

遞歸使用的個條件:函數

1.一個問題的解能夠拆解成爲幾個子問題的解;子問題就是數據規模更小的問題編碼

2.此問題與分解以後的子問題,除了數據規模不一樣,求解思路徹底同樣翻譯

3.存在遞歸終止條件,即不存在無限循環遞歸

4、如何實現遞歸

寫遞歸代碼的關鍵是找到如何將大問題分解爲小問題規律,寫出遞推公式,找到終止條件,最後將遞推公式和終止條件翻譯成代碼。內存

避免思惟誤區:不要試圖想清楚遞歸每一步的執行,這種試圖想清楚整個遞和歸過程的想法,就是一個思惟誤區。虛擬機

正確的思惟方式:若是一個問題A能夠分解爲子問題B、C、D,能夠假設B、C、D已經解決,在此基礎上思考如何解決問題A。而且,只須要思考問題A和子問題B、C、D、兩層之間的關係便可,不須要一層一層往下思考子問題與子子問題,屏蔽掉遞歸細節,這樣,理解起來就比較簡單了。

所以,只要遇到遞歸,就把它抽象成一個遞推公式,不用想一層層的套用關係,不要試圖用人腦去分解遞歸的每一個步驟

5、遞歸的常見問題以及解決方案

遞歸代碼要警戒堆棧溢出:函數調用會使用棧來存儲臨時變量,每調用一個函數,都會將臨時變量封裝爲棧幀壓入內存找,等到函數返回時,纔會出棧。系統棧或者虛擬機棧空間通常都不大。若是遞歸求解的數據規模很大,調用層次很深,一直壓入棧,就會有堆棧溢出的風險。

能夠經過限制遞歸調用的最大深度來解決這個問題。

遞歸代碼要警戒重複計算:爲了不重複計算,咱們能夠經過一個數據結構(好比散列表)來保存已經求解過的f(k)。當遞歸調用到f(k)時,先看是否已經求解過了。若是是,直接從散列表中取值返回,不須要重複計算。


小結:

遞歸是一種很是高效、簡潔的編碼技巧。只要知足「三個條件」的問題就能夠經過遞歸代碼來解決。

編寫遞歸代碼的關鍵是不要把本身繞進去,正確姿式是寫出遞推公式,找出終止條件,而後再翻譯成代碼

遞歸調用雖然簡潔高效,可是遞歸代碼也有弊端。好比堆棧溢出重複計算函數調用耗時多空間複雜度高等。寫遞歸代碼的時候。必定要控制好這些反作用

相關文章
相關標籤/搜索