斐波那契數列
指的是這樣乙個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368.. 今天我們來一起回顧一下這個數列,重新認識一下遞迴的原理。
大家還記得我們的課本上講遞迴的時候,先引入的是它的演算法定義,然後帶大家去編碼的對吧?說到這裡不得不吐槽下中國的教育改變了我們思考問題的方法,以致於我們在處理乙個真正問題的時候很難指出來這是乙個可以用遞迴解決的問題。我這裡先留一道題哈,下節課我們一起來分析一下,有n個台階,假設我們每次抬腳,可以選擇走乙個台階,也可以選擇走兩個台階,那麼請問,完成這n個台階有多少種走法?言歸正傳,我們繼續說遞迴(今天我們的思路和之前其他的演算法題會有所區別)。
一、什麼樣的問題可以用遞迴?
所有能夠用遞迴解決的問題都會滿足如下幾個條件:
問題是可以分解的,大問題可以劃分為若干子問題
子問題在某種程度上還是原來的問題,根本的性質是一樣的
子問題的規模比原問題小
子問題解決了,我們就能解決更大規模的問題
子問題無限分解也是有終止條件的,而且終止條件滿足時,問題的解是顯而易見的
那我們一塊再來看下斐波那契數列,是不是滿足這樣的規律。
f(n) = f(n-1) + f(n-2) ; n > 2
f(n) = 1; n =1,2
f(n) 能劃分為小問題 f(n-1) 和 f(n-2), 而 f(n-1) = f(n-2) + f(n-3), 是不是 f(n-2), f(n-3) 解決了才能求出 f(n-1), 進而求出f(n)呢? 他們的問題都是f問題,而且,f(1)=1, f(2) = 1; 是不是f問題存在終結條件呢?
二、如何用遞迴解決問題?
三、遞迴的真正原理和替代演算法是什麼
我們再看f(n) = f(n-1) + f(n-2), 大家知道f(100)的求解過程嗎?這裡面存在兩個過程,遞推和回溯。要求f(100) 我們先要求f(99), f(98), 而 f(98)先要求出f(97), f(96), 知道f(1), f(2);
現在我們求出了f(1), f(2), 我們再回去求f(3), 進而f(4), 一直到f(100).
從上面的求解過程中,大家發現了在遞推的過程中,我們把子問題是不是都依次入棧了,知道我們求出f(1,2)我們再將問題依次出棧,之後最後乙個問題f(100). 所以大家能夠發現,遞迴的本質就是入棧、出棧的問題,所以遞迴的複雜度會很高。同時,我們能夠用棧來優化遞迴。
四、遞迴的**模式
遞迴的**中包含兩個重要部分, 終止條件時直接返回,否則縮減問題規模呼叫它本身。public static int f(int n)
} else }
, 資料結構與演算法
和微軟經典演算法面試題輔導
演算法資料結構面試分享(四)括號匹配問題
今天在帖子上看見有同學在問,如果乙個字串中包含大括號和小括號,我們該如何解決括號匹配問題。我們今天就一起看下這道題吧。按照我們之前的套路,按部就班來 一 確保我們理解了問題,並且嘗試乙個例子,確認理解無誤。舉個例子,這樣的括號是匹配的,而類似於 最後乙個 匹配的是第乙個 倒數乙個 匹配的是倒數第三個...
Python實現資料結構與演算法 斐波那契數
斐波那契數,通常用 f n 表示,形成的序列稱為斐波那契數列。該數列由 0 和 1 開始,後面的每一項數字都是前面兩項數字的和。也就是 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.給定 n,計算 f n 示例 1 輸入 2 輸出 1 解釋 f 2 f 1 f 0 1 0 1...
資料結構與演算法 五 兔子數列 斐波那契數列
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞迴的方法定義 f ...