資料結構與演算法 第七章 遞迴

2021-10-06 21:41:42 字數 2475 閱讀 8722

7.小結

8.參考

遞迴是一種程式設計技巧,在許多資料結構和演算法中都用了遞迴進行實現,如果要學習後面相對比較複雜的資料結構與演算法,掌握遞迴非常重要。

我們先來看乙個例子,比如我們在電影院看電影,想知道自己坐在第幾排,但是電影院太黑沒法自己數,於是我們問前面的人他在第幾排,但是前面的人也不知道,所以他也問前面的人,依次類推,直到問到第一排的人,然後再一排一排的把數字傳回來,每次加 1,最後你就知道具體在哪一排了。

這就是乙個非常標準的遞迴求解問題的分解過程,去問的過程叫做 「遞」,回答的過程叫做 「歸」。

大部分遞迴問題都可以用遞迴公式進行表示,以上面電影院的例子來說。遞迴公式如下:

f (n

)=f(

n−1)

+1

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

f(n)=f

(n−1

)+1 其中,f(1

)=

1f(1) = 1

f(1)=1

有了上面的公式,我們就可以寫出遞迴的**

private

static

intf

(int n)

return

f(n -1)

+1;}

那究竟什麼樣的問題可以用遞迴來解決呢?只要同時滿足以下三個條件,就可以用遞迴來解決。

1.乙個問題的解可以分解為幾個子問題的解

何為子問題?子問題就是資料規模更小的問題。比如,前面講的電影院的例子,你要知道,「自己在哪一排」的問題,可以分解為「前一排的人在哪一排」這樣乙個子問題。

2.這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣

比如電影院那個例子,你求解「自己在哪一排」的思路,和前面一排人求解「自己在哪一排」的思路,是一模一樣的。

3.存在遞迴終止條件

把問題分解為子問題,把子問題再分解為子子問題,一層一層分解下去,不能存在無限迴圈,這就需要有終止條件。

還是電影院的例子,第一排的人不需要再繼續詢問任何人,就知道自己在哪一排,也就是 f(1

)=

1f(1)=1

f(1)=1

,這就是遞迴的終止條件。

有了上面的理論,我們再分析乙個遞迴的例子,假設有 n 個台階,每次可以跨 1 個台階或者 2 個台階,走完這個 n 個台階有多少種走法?

我們先分析最簡單的

假設 n = 1,那麼我們只有一種走法,走 1 個台階。

假設 n = 2,那麼我們只有兩種走法,走兩次 1 個台階或者一次走 2 個台階。

假設 n = 3,我們現在已經走了第一步了,如果第一步走了 1 個台階,那麼我們需要考慮剩下的 2 個台階的走法,其實就是 n=2 的走法,如果第一步走了 2 個台階,那麼我們只能走一步,也就是 n=1的走法,所以可以得到公式:f(3

)=f(

2)+f

(1

)f(3) =f(2)+f(1)

f(3)=f

(2)+

f(1)

。假設現在有 n 階台階,我們的走法,就是 n-1 階的走法加上 n-2 階的走法

用遞迴公式表示

f (n

)=f(

n−1)

+f(n

−2

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

f(n)=f

(n−1

)+f(

n−2)

有了遞迴公式,接下來我們需要找到遞迴終止的條件

終止條件有兩個

最終的**如下:

private

static

intf

(int n)

if(n ==2)

return

f(n -1)

+f(n -2)

;}

我們是否可以將遞迴**改寫成非遞迴代價呢?

private

static

intf2

(int n)

return res;

}

private

static

intf2

(int n)

if(n ==2)

int res =0;

int n_minus_1 =2;

// 假設 n=3,n-1=2 個台階有2種走法

int n_minus_2 =1;

// 假設 n=3,n-2=1 個台階有1種走法

for(

int i =

3; i <= n; i++

)return res;

}

通過上面兩個例子可以看出,非遞迴的寫法,不僅多出很多**,而且非常難以理解,但是本質上和遞迴是一樣的,只是"手動"進行遞迴。

遞迴有利有弊,利是遞迴**的表達力很強,寫起來非常簡潔;而弊就是空間複雜度高、有堆疊溢位的風險、存在重複計算、過多的函式呼叫會耗時較多等問題。

資料結構第七章

平衡二叉樹 基本思想 在構造二叉排序樹的過程中,每插入乙個 結點時,首先檢查是否因插入而破壞了樹的平衡性,若是,則找出最小不平衡子樹,在保持二叉排序樹特 性的前提下,調整最小不平衡子樹中各結點之間的鏈 接關係,進行相應的旋轉,使之成為新的平衡子樹 平衡二叉樹 或者是一棵空的二叉排序樹,或者是具 有下...

PTA資料結構與演算法 第七章 排序

1 1僅基於比較的演算法能得到的最好的 最壞時間複雜度 是o nlogn t 對n個記錄進行快速排序,在最壞的情況下,其時間複雜度是o nlogn 1 2對n個記錄進行簡單選擇排序,比較次數和移動次數分別為o n2 和o n t1 3 對n個不同的資料採用氣泡排序進行從大到小的排序,當元素基本有序時...

資料結構筆記(第七章)

線性表的查詢技術 1 順序查詢 基本思想 從線性表的一端向另一端逐個將關鍵碼與 給定值進行比較,若相等,則查詢成功,給出該記錄 在表中的位置 若整個表檢測完仍未找到與給定值相 等的關鍵碼,則查詢失敗,給出失敗資訊。順序查詢 線性查詢 int seqsearch1 int r int n,int k ...