資料結構與演算法系列九(遞迴詳解)

2022-07-18 03:00:20 字數 4305 閱讀 6477

有人說,資料結構與演算法,計算機網路,與作業系統都一樣,脫離日常開發,除了面試這輩子可能都用不到呀!

有人說,我是做業務開發的,只要熟練api,熟練框架,熟練各種中介軟體,寫的**不也能「飛」起來嗎?

於是問題來了:為什麼還要學習資料結構與演算法呢?

#理由一:

面試的時候,千萬不要被資料結構與演算法拖了後腿

#理由二:

你真的願意做一輩子crud boy嗎

#理由三:

不想寫出開源框架,中介軟體的工程師,不是好廚子

我想好了,還是需要學習資料結構與演算法。但是我有兩個困惑:

1.如何著手學習呢?

2.有哪些內容要學習呢?

學習方法推薦:

#學習方法

1.從基礎開始,系統化學習

2.多動手,每一種資料結構與演算法,都自己用**實現出來

3.思路更重要:理解實現思想,不要背**

4.與日常開發結合,對應應用場景

學習內容推薦:

資料結構與演算法內容比較多,我們本著實用原則,學習經典的、常用的資料結構、與常用演算法

#學習內容:

1.資料結構的定義

2.演算法的定義

3.複雜度分析

4.常用資料結構

陣列、鍊錶、棧、佇列

雜湊表、二叉樹、堆

跳表、圖

5.常用演算法

遞迴、排序、二分查詢

搜尋、雜湊、貪心、分治

動態規劃、字串匹配

1.求最終推薦人

2.電影院看電影

相信你已經對遞迴有乙個直觀的認識了。那麼這一篇我們來對遞迴做乙個詳細的分析,比如以下這幾個問題,如果你都知道,那麼恭喜你!你都會搶答了(開個玩笑,這是黑土大爺說的:不是賣車,就是賣拐,對吧)。

言歸正傳,關於遞迴,我們只需要搞清楚以下幾個問題,就算是完全掌握了。很簡單有沒有?

#考考你:

1.你知道哪些問題適合用遞迴解決嗎?

2.你知道編寫遞迴**的關鍵步驟嗎?

我們說每一種資料結構與演算法,都是在特定問題域下的產物;也就是說每一種資料結構與演算法,都有它們各自適用的問題場景。

1.問題可以分解為子問題

簡述:

對於乙個問題的求解,本身可以被分解為更小的子問題

案例:

電影院案例:我們在哪一排的問題,可以分解為我們的前一排人在哪一排的子問題

2.問題的求解,與分解後的子問題,求解思路一致

簡述:

問題本身的求解思路,與分解後的子問題求解思路一致

案例:

電影院案例:求解我們在哪一排的問題思路,與求解我們前一排人在哪一排的思路一致

3.問題的求解,存在終止條件

簡述:

注意,這一條很重要,遞迴一定要有明確的終止條件,否則就等於死迴圈了

案例:

電影院案例:存在終止條件,如果是第一排,則f(1)=1

知道了遞迴適合解決的問題,那麼在實際軟體開發中,我們該如何更有效率的編寫遞迴**呢?有沒有什麼套路,或者模板。答案是有。

編寫遞迴**,有兩個關鍵步驟:

1.找出遞推公式

簡述:

前面我們說了,遞迴適合於將問題分解為子問題,然後問題本身的求解,與子問題求解思路一致。你需要仔細琢磨並理解這句話的含義,這句話是精髓。如果你理解了,你會發現這其實是乙個重複性的問題。

那麼順著這個思路,我們只需要將子問題,在繼續分解問為更小的子問題......一直到子問題不能再分解為止。

這裡需要提醒乙個常見的思維誤區:我們在分解問題的時候,千萬不要在大腦裡去重現每乙個分解步驟,這樣容易把自己繞進去:走火入魔。畢竟人類的大腦只適合平鋪直敘的思維方式,重複性的東西更適合電腦,對吧。你只需要找出不能再分解的最小子問題,然後解決它就對了

案例:

電影院案例:f(n)=f(n-1)+1

2.找出終止條件

簡述:

關於遞迴就是乙個不斷分解子問題,與求解子問題的過程。因此一定要存在明確的終止條件。一定要找到它,不然就死迴圈了。

案例:

電影院案例:f(1)=1

我們通過乙個稍微複雜些的案例,來鞏固3.13.2兩節的內容。假設有乙個n階的台階,小明每一步可以走1個台階,或者走2個台階。求小明走完台階,總共有多少種走法?

3.3.1.找出遞推公式

我們首先嘗試分析,有這麼幾個前提:

1.總台階數是n

2.走台階的方式,一次可以走1個台階,或者一次可以走2個台階

那麼根據遞迴求解過程:分解子問題。不過這個案例稍微複雜一些,我們可以假設小明第一步只走1個台階,是一種走法,即 f(n-1);第一步走2個台階,又是一種走法,即f(n-2)

這樣一來,我們就可以得出遞推公式,走完n個台階的走法f(n),等於第一步走1個台階的走法f(n-1),加上第一步走2個台階的走法f(n-2)。即:

#走n個台階的遞推公式

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

3.3.2.找出終止條件

尋找終止條件的前提是,假設子問題不能再分解為更小的子問題的時候,有明確的終止條件。我們繼續嘗試分析:

1.我們假設最後只剩下1個台階的情況,只有一種走法,即:f(1)=1

2.我們假設最後剩下2個台階的情況,一次可以走1個台階,是一種走法;一次可以走2個台階,又是一種走法。那麼剩下2個台階的走法是:f(2)=2

#走n個台階的終止條件

只剩下1個台階:f(

1)=1

剩下2個台階:f(

2)=2

3.3.3.實現**

有了遞推公式,與終止條件,再來編寫遞迴**就是水到渠成的事情了,很簡單了有沒有

/**

* 遞迴求解走n階抬價的走法:

* 1.求解遞推公式

* 1.1.前提:每次可以走1步台階,或者2步台階

* 1.2.第一步走法是關鍵:

* 1.2.1.如果第一步走1步台階,則剩下n-1步台階

* 1.2.2.如果第一步走2步台階,則剩下n-2步台階

* 1.3.根據1.2.1與1.2.2得出:

* 1.3.1.遞推公式:f(n) = f(n-1) + f(n-2)

* 1.3.2.f(n-1)表示剩下n-1步台階走法

* 1.3.3.f(n-2)表示剩下n-2步台階走法

** 2.求解終止條件

* 2.1.如果只剩下1步台階,則f(1)=1

* 2.2.如果剩下2步台階,則f(2)=2,有兩種走法

* @paramn*/

public

static

int walkingmethod(int

n)

#考考你答案:

1.你知道哪些問題適合用遞迴解決嗎?

1.1.如果乙個問題,滿足三個條件,適合用遞迴解決

a.問題本身,可以分解為子問題

b.問題本身的求解思路,與分解後的子問題求解思路一致

c.求解問題,本身存在明確的終止條件

2.你知道編寫遞迴**的關鍵步驟嗎?

2.1.編寫遞迴**的關鍵步驟,有兩步

a.根據分解後的子問題,找出遞推公式

b.當子問題足夠小的時候,找出終止條件

資料結構與演算法系列 Sunday演算法詳解

一 背景 sunday演算法是daniel m.sunday於1990年提出的字串模式匹配。其效率在匹配隨機的字串時比其他匹配演算法還要更快。sunday演算法的實現可比kmp,bm的實現容易太多。二 分析假設我們有如下字串 a lessons tearned in software te b so...

C 資料結構與演算法系列(十三) 遞迴 迷宮問題

初始化地圖 n for int i 0 i map.length i system.console.writeline setway map,1,1 system.console.writeline n小球走過,並標識過的地圖情況 n for int i 0 i map.length i syste...

資料結構與演算法系列八(遞迴見面禮)

有人說,資料結構與演算法,計算機網路,與作業系統都一樣,脫離日常開發,除了面試這輩子可能都用不到呀!有人說,我是做業務開發的,只要熟練api,熟練框架,熟練各種中介軟體,寫的 不也能 飛 起來嗎?於是問題來了 為什麼還要學習資料結構與演算法呢?理由一 面試的時候,千萬不要被資料結構與演算法拖了後腿 ...