三、為什麼使用遞迴?遞迴的優缺點?
四、如何實現遞迴?
五、遞迴常見問題及解決方案
六、如何找到「最終推薦人」?
\quad
遞迴是一種非常高效、簡潔的編碼技巧,一種應用非常廣泛的演算法,比如dfs深度優先搜尋、前中後序二叉樹遍歷等都是使用遞迴。
\quad
方法或函式呼叫自身的方式稱為遞迴呼叫,呼叫稱為遞,返回稱為歸。即:去的過程叫「遞」,回來的過程叫「歸」。
\quad
基本上,所有的遞迴問題都可以用遞推公式來表示:一排人的位置(通過詢問前乙個人的位置):
\quad
f(n)=f(n-1)+1 \quad
其中,f(1)=1
\quad
何為子問題?子問題就是資料規模更小的問題。比如,電影院的例子,你要知道,「自己在哪一排」的問題,可以分解為「前一排的人在哪一排」這樣乙個子問題。2. 這個問題與分解之後的子問題,除了資料規模不同,求解思路完全一樣。
\quad
「自己在哪一排」的思路,和前面一排人求解「自己在哪一排」的思路,是一模一樣的。
\quad
把問題分解為子問題,把子問題再分解為子子問題,一層一層分解下去,不能存在無限迴圈,這就需要有終止條件。還是電影院的例子,第一排的人不需要再繼續詢問任何人,就知道自己在哪一排,也就是 f(1)=1,這就是遞迴的終止條件。
\quad
**的表達力很強,寫起來簡潔。
\quad
空間複雜度高、有堆疊溢位風險、存在重複計算、過多的函式呼叫會耗時較多等問題。
\quad
寫遞迴**的關鍵就是找到如何將大問題分解為小問題的規律,並且基於此寫出遞推公式,然後再推敲終止條件,最後將遞推公式和終止條件翻譯成**。
\quad
籠統的講,所有的遞迴**都可以改寫為迭代迴圈的非遞迴寫法。如何做?抽象出遞推公式、初始值和邊界條件,然後用迭代迴圈實現。
\quad
可以宣告乙個全域性變數來控制遞迴的深度,從而避免堆疊溢位。
\quad
通過某種資料結構來儲存已經求解過的值,從而避免重複計算。
\quad
資料庫裡存在髒資料,我們還需要處理由此產生的無限遞迴問題。如果 a 的推薦人是 b,b 的推薦人是 c,c 的推薦人是 a,這樣就會發生死迴圈。
\quad
actor_id 表示使用者 id,referrer_id 表示推薦人 id。
LeeCode584 尋找使用者推薦人
給定表 customer 裡面儲存了所有客戶資訊和他們的推薦人。id name referee id 1 will null 2 jane null 3 alex 2 4 bill null 5 zack 1 6 mark 2 寫乙個查詢語句,返回乙個客戶列表,列表中客戶的推薦人的編號都 不是 2。...
EcShop 中關於註冊推薦 填寫推薦人的功能實現
前幾天有人提出這個註冊推薦功能,我和他說針對ec來說是有推薦註冊提成提積分的功能的,他說想在註冊時使用這個。發現網上是有這方面的論述的,但是很遺憾貌似是有問題的所以今天把這個重新修改下在這裡記錄下希望以後能用的上。1 修改註冊頁面檔案 themes 模板 user password.dwt 查詢 在...
EcShop 中關於註冊推薦 填寫推薦人的功能實現
前幾天有人提出這個註冊推薦功能,我和他說針對ec來說是有推薦註冊提成提積分的功能的,他說想在註冊時使用這個。發現網上是有這方面的論述的,但是很遺憾貌似是有問題的所以今天把這個重新修改下在這裡記錄下希望以後能用的上。1 修改註冊頁面檔案 themes 模板 user password.dwt 查詢 在...