斐波拉契數是乙個很經典的問題,也會很多公司面試的考題,每個學習計算機的同學都會接觸這個問題,尤其是在學習遞迴的時候,利用遞迴來解決斐波拉契數是很多教材採用的乙個例子,所以很多同學一想到斐波拉契馬上就會採用遞迴,遞迴貌似簡單,但是效率真的很高嗎?不然!下面是我在學習動態規劃的過程中總結的集中解決斐波拉契數的不同方法:
一、最野蠻最原始的方法
long f0(int n)
這是最直接的遞迴方式,其時間複雜度為o(1.618^n),是乙個指數時間級的演算法,當n超過30時,你就慢慢等待吧,運氣差的話直接宕機了。
二、自底向上的動態規劃方法
我們已知f(0)和f(1)的值,則我們從f(2)開始就可以利用前面兩個已經計算出來的值,這樣從小到大就可以最終求出f(n)
long f(int n) return t; }
其時間複雜度已經從指數級降到線性級o(n)了,空間複雜度為o(1)
三、自頂向下的動態規劃方法
這種方法也是採用遞迴的思想,但是確應用了動態規劃的原理:將以前的計算結果儲存起來備用,這樣在以後出現同樣的問題時就不用重複計算。也叫備忘錄方法。
int fib[1000] = ; long f1(int n)
自頂向下的動態規劃遞迴方法大大減少了遞迴呼叫的次數,避免了重複遞迴計算,其演算法時間複雜度也為線性級,其關鍵就是能夠"儲存已經計算過的子問題的結果".
三種方法實現斐波那契數列
問題描述 編寫程式在控制台輸出斐波那契數列前t項,每輸出5個數換行 第一種方法 耗時比較短 publicstaticvoidtest1 long t longend system.currenttimemillis system.out.println end start 第二種方法 耗時太長沒有測...
三種方法求斐波拉契數列
斐波那契數列 斐波那契數列 1,1,2,3,5,8,13,21,34,55,89,144,如果設f n 為該數列的第n項 n n 那麼這句話可以寫成如下形式 f n f n 1 f n 2 顯然這是乙個線性遞推數列。include 遞迴的方法求斐波拉契數列 優點簡單明瞭,缺點當所求數過大時占用記憶體...
實現斐波那契數列的三種方法
斐波那契數列又稱 分割數列。它的特點是從第3個數開始,每乙個數都等於前面兩個數相加。例 0 1 1 2 3 5 8 13 21.從上我們可以總結出以下規律 當n 0時 f n 0 當n 1時 f n 1 當n 1時 f n f n 1 f n 2 那我們如何求出這個數列中第n個數是多少呢?一 以指標...