遞歸拆解三步驟

算法思路

“遞歸”一詞顧名思義就是一個方法在不斷的調用自己,沒錯,但這只是對遞歸最表層的理解。

那麼遞歸的實質是什麼?

遞歸的本質是在能夠把一個大問題不斷的拆解成比他小點的問題,然後,當我們拿到最核心的小問題解,就可以利用小問題的解去不斷的解決大問題的解。

那小問題的解該如何去得到?

用再小一號的問題去解構出來,小到不能再小的時候就是我們最核心、最基礎的零號問題。

通過以上的這些發問,我們不難總結出遞歸算法的三步驟:

核心、基礎問題:就是遞歸的終點,走到最小的那個問題,能夠直接給出結果,不必再往下走的終點答案,

拆解:把每一層的問題都要拆解的比上一層的小,不斷縮小問題的大小,才能找到最核心的遞歸終點問題。

組合:得到小問題解之後,還要知道如何才能根據它去不斷的構造和挑戰大問題的解。

所以,但我們拿到遞歸算法題時,我們可以按照三步驟來進行分析,把這三個問題搞清楚之後,代碼很容易能夠寫出來了。

經典案例

斐波那契數列

題目描述

斐波那契數列是一位意大利的數學家,他閒着沒事去研究兔子繁殖的過程,研究着就發現,可以寫成這麼一個序列:1,1,2,3,5,8,13,21… 也就是每個數等於它前兩個數之和。那麼給你第 n 個數,問 F(n) 是多少。

解析

用數學公式表示很簡單:

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

代碼也很簡單,用我們剛總結的三步:

最核心、最基礎的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);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章