算法思路
“遞歸”一詞顧名思義就是一個方法在不斷的調用自己,沒錯,但這只是對遞歸最表層的理解。
那麼遞歸的實質是什麼?
遞歸的本質是在能夠把一個大問題不斷的拆解成比他小點的問題,然後,當我們拿到最核心的小問題解,就可以利用小問題的解去不斷的解決大問題的解。
那小問題的解該如何去得到?
用再小一號的問題去解構出來,小到不能再小的時候就是我們最核心、最基礎的零號問題。
通過以上的這些發問,我們不難總結出遞歸算法的三步驟:
核心、基礎問題:就是遞歸的終點,走到最小的那個問題,能夠直接給出結果,不必再往下走的終點答案,
拆解:把每一層的問題都要拆解的比上一層的小,不斷縮小問題的大小,才能找到最核心的遞歸終點問題。
組合:得到小問題解之後,還要知道如何才能根據它去不斷的構造和挑戰大問題的解。
所以,但我們拿到遞歸算法題時,我們可以按照三步驟來進行分析,把這三個問題搞清楚之後,代碼很容易能夠寫出來了。
經典案例
斐波那契數列
題目描述
斐波那契數列是一位意大利的數學家,他閒着沒事去研究兔子繁殖的過程,研究着就發現,可以寫成這麼一個序列:1,1,2,3,5,8,13,21… 也就是每個數等於它前兩個數之和。那麼給你第 n 個數,問 F(n) 是多少。
解析
用數學公式表示很簡單:
代碼也很簡單,用我們剛總結的三步:
最核心、最基礎的Case:f(0)=0,f(1)=1;
分解:f(n-1),f(n-2)
組合:f(n)=f(n-1)+f(n-2)
那麼寫出代碼來就是:
class Solution {
public int fib(int N) {
if (N == 0) {
return 0;
} else if (N == 1) {
return 1;
}
return fib(N-1) + fib(N-2);
}
}