一、如何理解「遞迴
」
遞迴是一種應用非常廣泛的演算法(或者程式設計技巧)。
二、遞迴的三個條件
1、乙個問題的解可以分解為幾個子問題的解
2、這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣
3、存在遞迴終止條件
三、如何編寫遞迴**
寫遞迴**最關鍵的是
找到如何將大問題分解為小問題的規律,並且基於此寫出遞推公式,然後再失調終止條件,最後將遞推公式和終止條件,最後將遞推公式和終止條件翻譯成**
。四、遞迴**的注意事項
1、遞迴**要警惕堆疊溢位
函式呼叫的機制是通過堆疊來實現的,遞迴**層次過深會容易溢位堆疊空間。
2、遞迴**要警惕重複計算
遞推公式分解時,會存在大量重複計算。
五、遞迴**改寫為非遞迴**
遞迴**有利有弊,利是遞迴**的表達力很強,寫起來非常簡潔;而弊就是空間複雜度高、有堆疊溢位的風險、存在重複計算、過多的函式呼叫會耗時較多等問題。
在開發過程中,要根據實際情況來選擇是否需要用遞迴的方式來實現。
是否所有的遞迴**都可以改為迭代迴圈的非遞迴寫法?
籠統地講,是的。因為遞迴本身就是借助棧來實現的,只不過我們使用的棧是系統或者虛擬機器本身提供的,我們沒有感知而已。
六、課後思考
我們平時除錯**喜歡使用ide的單步跟蹤功能,像規模比較大、遞迴層次很深的遞迴**,幾乎無法使用這種除錯方式。對於遞迴**,你有什麼好的除錯方法呢?
遞迴使用不多,沒有遇到過類似的問題,但感覺可以使用單元測試來排程,不管是通過進行檢視結果,也能mock資料來驗證遞迴公式是否正確。
資料結構與演算法之美 07 鍊錶
class program var strs new char var index find strs,b console.readkey static int find2 char a,char key n 6 key 7 a n 6 key 6 if a null a.length 0 int ...
資料結構與演算法之美 8 遞迴演算法
遞迴嚴格說起來不算一種演算法,只能說是一種問題處理思想或者問題處理技巧。只要問題同時滿足以下三個條件,就可以考慮用遞迴來解決 乙個問題的解可以分解為幾個子問題的解 這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣 存在遞迴終止條件 個人覺得,寫遞迴 最關鍵的是寫出遞推公式,找到終止條件...
資料結構與演算法之美
什麼是資料結構?什麼是演算法 狹義重點 複雜度分析 方法 邊學邊練,適度刷題 複雜度分析 時間複雜度 常見時間複雜度 非多項式量級 非常低效的演算法 空間複雜度 漸進空間複雜度,表示演算法的儲存空間和資料規模的增長關係 最好情況時間複雜度 理想情況的時間複雜度 最壞情況時間複雜度 最糟糕的情況下的時...