資料結構與演算法 基礎演算法篇 遞迴

2021-10-06 17:41:06 字數 1025 閱讀 2793

遞迴是一種非常高效、簡潔的編碼技巧,一種應用非常廣泛的演算法,比如dfs深度優先搜尋、前中後序二叉樹遍歷等都是使用遞迴。

方法或函式呼叫自身的方式稱為遞迴呼叫,呼叫稱為遞,返回稱為歸。

基本上,所有的遞迴問題都可以用遞推公式來表示,比如

f(n) = f(n-1) + 1;

f(n) = f(n-1) + f(n-2);

f(n)=n*f(n-1);

優點:**的表達力很強,寫起來簡潔。

缺點:空間複雜度高、有堆疊溢位風險、存在重複計算、過多的函式呼叫會耗時較多等問題。

問題的解可以分解為幾個子問題的解。何為子問題?就是資料規模更小的問題。

問題與子問題,除了資料規模不同,求解思路完全一樣

存在遞迴終止條件

遞迴**編寫

寫遞迴**的關鍵就是找到如何將大問題分解為小問題的規律,並且基於此寫出遞推公式,然後再推敲終止條件,最後將遞推公式和終止條件翻譯成**。

遞迴**理解

對於遞迴**,若試圖想清楚整個遞和歸的過程,實際上是進入了乙個思維誤區。

那該如何理解遞迴**呢?如果乙個問題a可以分解為若干個子問題b、c、d,你可以假設子問題b、c、d已經解決。而且,你只需要思考問題a與子問題b、c、d兩層之間的關係即可,不需要一層層往下思考子問題與子子問題,子子問題與子子子問題之間的關係。遮蔽掉遞迴細節,這樣子理解起來就簡單多了。

因此,理解遞迴**,就把它抽象成乙個遞推公式,不用想一層層的呼叫關係,不要試圖用人腦去分解遞迴的每個步驟。

警惕堆疊溢位:可以宣告乙個全域性變數來控制遞迴的深度,從而避免堆疊溢位。

警惕重複計算:通過某種資料結構來儲存已經求解過的值,從而避免重複計算。

籠統的講,所有的遞迴**都可以改寫為迭代迴圈的非遞迴寫法。

如何做?抽象出遞推公式、初始值和邊界條件,然後用迭代迴圈實現。

我們平時除錯**喜歡使用 ide 的單步跟蹤功能,像規模比較大、遞迴層次很深的遞迴**,幾乎無法使用這種除錯方式。對於遞迴**,你有什麼好的除錯方法呢?

列印日誌發現,遞迴值。

結合條件斷點進行除錯。

資料結構與演算法解析 「遞迴」篇

遞迴,在數學與電腦科學中,是指在函式的定義中使用函式自身的方法。也就是說,遞迴演算法是一種直接或者間接呼叫自身函式或者方法的演算法。遞迴是一種應用非常廣泛的演算法 或者程式設計技巧 很多資料結構和演算法的編碼實現都要用到遞迴,比如 dfs 深度優先搜尋 前中後序二叉樹遍歷等等。去的過程叫 遞 回來的...

資料結構與演算法基礎 二 遞迴

這裡主要講一下運用遞迴的典型的例子 斐波那契數列 和 漢諾塔問題 遞迴 指在乙個方法 函式 的內部呼叫該方法本身的程式設計方式 1.斐波那契數列 1 1 2 3 5 8 13 規律 前兩個數之和等於第三個數 1 1 2,1 2 3,3 5 8 實現如下 package makasa1test 用遞迴...

資料結構與演算法 基礎概念篇

我們都知道 程式設計 資料結構 演算法 首先我們先來認識資料結構和演算法的基本概念。相關概念 資料 是描述客觀事物的符號,是計算機中能夠操作的物件,能夠被計算機所識別 並輸入給計算機處理的符號集合。資料元素 是組成資料,有一定意義的基本單位,在計算機中常被作為整體處理,也被稱之為記錄。資料項 乙個資...