學習筆記 資料結構 遞迴

2021-10-22 07:45:24 字數 1428 閱讀 3475

1、遞迴定義

方法或函式呼叫自身的方式成為遞迴呼叫

去的過程叫「遞」,回來的過程叫「歸」

2、遞迴需要滿足的條件

1、乙個問題可以分解為資料規模更小的問題。比如階乘,只需要計算本身的值和前乙個數的乘積

2、分解後的子問題,除資料規模不一樣,求解思路完全相同。

3、存在遞迴終止條件。一般用 if() return… 來返回最初的幾個特殊值

因此,編寫遞迴程式最關鍵的是寫出遞推公式,找到終止條件,剩下將地推公式轉換為**就簡單了

3、典型問題

爬樓梯問題

首先找到某一層與之前一層的關係,思路:當上一次台階時,有兩種選擇,一種是一次乙個台階,一種選擇是一次兩個台階,f(n)表示上台階之後的狀態,達到這種狀態只有兩種可能,一種是一次爬了兩個台階才到達此台階,另一種是一次爬了乙個台階到達此台階。對應的這兩種可能,又分別對應兩種可能,以此類推,那總結成公式即 f(n)=f(n-1) +f(n-2) ,其中 f(n-1)代表為了達到n級台階採用爬一級的方式,f(n-2)代表為了達到n級台階採用爬兩級的方式。

終止條件就是,f(1)=1,f(2)=2

把終止條件和剛剛得到的遞推公式放在一起可以得到:

f(1)=1;

f(2)=2;

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

轉換成**

public

intgetfibo

(int n)

編寫遞迴**的關鍵:只要遇到遞迴,就把它抽象成乙個遞推公式,不用想一層層的呼叫關係,不要試圖用人腦去分解遞迴的每個步驟。如果乙個問題a可以分解為若干子問題b c d,可以假設b .c.d已經解決,在此基礎上思考如何解決問題a

4、遞迴需要注意的點

1、警惕堆疊溢位 解決:當資料規模不大時,可以通過在**中限制遞迴呼叫的最大深度的方式來解決這個問題

int depth =0;

public

intgetfibo

(int n)

2、警惕重複計算 解決:通過乙個資料結構來儲存已經求結果的f(k)。當遞迴呼叫到f(k)時,先看下是否已經求結過了。如果是,則直接從雜湊表中取值返回,不需要重複計算。

3、空間複雜度會比較大,因為呼叫一次遞迴就會在記憶體棧中儲存一次資料現場

5、將遞迴**改寫成非遞迴**

遞迴優點:表達力強,**簡潔

遞迴缺點:空間複雜度高,有上述風險

利用for迴圈達到改寫目的

public

intgetfibo

(int n)

return ret;

}

學習筆記 資料結構

一 常用的資料結構 1 線性資料結構 元素之間一般存在元素之間存在一對一關係,是最常用的一類資料結構,典型的有 陣列 棧 佇列和線性表 2 樹形結構 結點間具有層次關係,每一層的乙個結點能且只能和上一層的乙個結點相關,但同時可以和下一層的多個結點相關,稱為 一對多 關係,常見型別有 樹 堆 3 圖形...

學習筆記 資料結構 堆結構

堆結構 實質是陣列 特點 以陣列的形式去儲存完全二叉樹 原理 以前序遍歷完全二叉樹,得出結點的前序序列,以陣列的形式儲存該序列。查詢父,子結點通過陣列下標id間的轉換關係實現。優點 節省儲存空間,查詢效率高 缺點 1 只能表示完全二叉樹 更廣泛的可以說是完全n叉樹 2 對樹的插入,刪除操作執行效率低...

學習筆記 資料結構 雜湊

雜湊表的特點 什麼是完全雜湊 雜湊方式 直接定址表的特點 雜湊表的特點,可以解決什麼問題 什麼是衝突 如何避免衝突 鏈結法的特點,插入,刪除,查詢的時間複雜度是多少 開放定址方法的原理 什麼是裝載因子 雜湊函式有什麼 同義詞的概念 聚集 堆積 現象 單向雜湊表的特徵 如何提高雜湊表的查詢效率 通過一...