1. 程式人生 > >資料結構與算法系列八(遞迴見面禮)

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

1.引子

1.1.為什麼要學習資料結構與演算法?

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

有人說,我是做業務開發的,只要熟練API,熟練框架,熟練各種中介軟體,寫的程式碼不也能“飛”起來嗎?

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

#理由一:
    面試的時候,千萬不要被資料結構與演算法拖了後腿
#理由二:
    你真的願意做一輩子CRUD Boy嗎
#理由三:
    不想寫出開源框架,中介軟體的工程師,不是好廚子

1.2.如何系統化學習資料結構與演算法?

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

1.如何著手學習呢?

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

學習方法推薦:

#學習方法
1.從基礎開始,系統化學習
2.多動手,每一種資料結構與演算法,都自己用程式碼實現出來
3.思路更重要:理解實現思想,不要背程式碼
4.與日常開發結合,對應應用場景

學習內容推薦:

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

#學習內容:
1.資料結構的定義
2.演算法的定義
3.複雜度分析
4.常用資料結構
    陣列、連結串列、棧、佇列
    散列表、二叉樹、堆
    跳錶、圖
5.常用演算法
    遞迴、排序、二分查詢
    搜尋、雜湊、貪心、分治
    動態規劃、字串匹配

2.考考你

到目前為止,基於線性表的資料結構我們都看完了,簡單回顧一下,它們是:陣列、連結串列、棧、佇列。這些資料結構是其它資料結構與演算法的基礎,需要重點關注。

這一篇開始,我們開啟演算法的列車了,請繫好安全帶!第一個要看的演算法是:遞迴。遞迴這兩個字你一定很熟悉,有沒有?

如果沒有的話,我們先舉一個例子。從2016年開始到如今,知識付費發展的如火如荼。如果你也是其中的一員,比如說在xx平臺購買了xx課程。大多數平臺都會告訴你,將你購買的課程分享出去,假如有人通過你分享的連結購買了該課程,那麼平臺會給你佣金返現。

既然與錢有關係,那就比較麻煩了!對於平臺來說,有這麼幾個問題需要搞清楚。比如說:1.誰是一級推薦人?

2.誰是二級推薦人......?

3.誰是最終推薦人?

因為不同級的推薦人,返現佣金的比例可不一樣,千萬別返錯了,對吧。關於這種類似求推薦人的問題,有請我們今天的主角登場,它就是:遞迴。

#遞迴稍微有些複雜,我們通過兩篇來學習:
1.第一篇是見面禮:
  1.1.體會兩個生活中的小案例
  
2.第二篇是重頭戲:
  2.1.詳細分析遞迴的實現
  2.2.遞迴實現的注意事項

3.案例

3.1.求最終推薦人

簡述:

1.A在某某知識付費平臺購買了課程:xx。並將連結分享到了微信朋友圈

2.B通過A分享的連結,購買了課程:xx。並且將連結分享到了微信朋友圈

3.C通過B分享的連結,購買了課程:xx。並且將連線分享到了微信朋友圈

4.以此類推下去......

5.假如以C為起點,如何求出課程:xx的最終推薦人?

6.假設資料庫中儲存的資料是這樣的:

 

 

求解:

1.你肯定想到了,這個問題好簡單,經常寫如下類似這樣的程式碼:

/**
* 求最終推薦人
*/
public String findRootRecommend(String userId,String xx){
    // 根據購買課程使用者id、課程  查詢資料庫,獲取推薦使用者id
    String 【分享使用者id】 = select 【分享使用者id】 from 【購買課程表】 where 【使用者id】 = 【userId】 and 【課程id】 = 【xx】;
    
    // 判斷是否是根據好友分享購買的課程
    if(分享使用者id == null){
        return userId;
    }
    
    // 遞迴查詢
    return findRootRecommend(分享使用者id,xx);
}

3.2.電影院看電影

簡述:

1.你與女朋友正在電影院看電影,電影已經放映

2.突然,女朋友問你:我們坐在電影院的第幾排?

3.你一看,壞了:電影院一片漆黑,伸手不見五指

4.這個問題必須要回答,因為是女朋友問的,你該怎麼辦?

求解:

1.別忘了,你是程式設計師,對於程式設計師來說,這個問題太簡單了

2.用遞迴:先問前一排的人,他們在第幾排?

3.前一排的人,再問他的前一排,在第幾排?

4.以此類推......

5.一直問到第一排的人,第一排不需要再問了,直接回答在第一排

6.第二排的人:在第一排的人基礎上 + 1

7.以此類推......

8.每一排都在前一排的基礎上 + 1,最後到了你們這一排,女朋友得到了滿意的答案

9.你很驕傲有沒有?用程式碼回答,類似這樣:

public int movies(int n){
    // 如果是第一排,返回1
    if(n == 1){ return 1;}
    
    // 遞歸向前一排詢問
    return movies(n - 1) + 1;
}

&n