Fibonacci Number (斐波那契數列)

2021-06-02 01:55:05 字數 1043 閱讀 2536

問題:

f0 = 0

f1 = 1

fn = fn − 1 + fn − 2

求fn

fibonacci數列是乙個非常經典的用遞迴解決的問題。遞迴方法如下:

public int f(int n)
用遞迴做的話,它的複雜度是指數級的,原因可以通過畫遞迴的結構圖就能馬上明白了。

還有一種方法是用動態規劃的實現,從第乙個開始,而不是從最後乙個。這樣做的好處是我們不會重複計算同乙個值,比如我們計算f(10)的時候,如果用遞迴方法,f(4)會被計算很多遍,浪費了很多時間。

public int f(int n) 

return f[n];

}

這種方法的空間複雜度為o(n),我們可以使一點小手段,把空間複雜度降為 o(1)

public int f(int n) 

return b;

} }

但是,這兩種方法(遞迴和dp)都不是最好的方法,我們來看看乙個更巧的方法。

首先告訴你乙個事實(下圖),可能你不一定會相信。如果你不相信,你可以自己動手試試看。

有了這個式子,問題就還沒有完,我們先做乙個簡單的運算。

如果我們想知道2的100次方是多少,如果你稍微想一下就知道我們先找2的50次方(因為2^100 = 2^50 * 2^50),再找2的25次方,再找2的12次方,。。。,直到2的一次方。

好了,有了上面的基礎,如果要算乙個矩陣的n次方,我們就不會乙個乙個矩陣相乘了。**如下:

public int pow(int n) , };

if (n == 1) return m;

else if (n%2 == 0) return pow(n/2) * pow(n/2);

else return pow(n/2) * pow(n/2) * m;

}

這樣,整個演算法複雜度為o(lg n) . 注意:這裡的矩陣乘法並沒有實現,可以寫乙個函式實現即可。

Fibonacci Number (斐波那契數列)

問題 f0 0 f1 1 fn fn 1 fn 2 求fn fibonacci數列是乙個非常經典的用遞迴解決的問題。遞迴方法如下 public int f int n 用遞迴做的話,它的複雜度是指數級的,原因可以通過畫遞迴的結構圖就能馬上明白了。還有一種方法是用動態規劃的實現,從第乙個開始,而不是從...

Fibonacci Number (斐波那契數列)

問題 f0 0 f1 1 fn fn 1 fn 2 求fn fibonacci數列是乙個非常經典的用遞迴解決的問題。遞迴方法如下 public int f int n 用遞迴做的話,它的複雜度是指數級的,原因可以通過畫遞迴的結構圖就能馬上明白了。還有一種方法是用動態規劃的實現,從第乙個開始,而不是從...

斐波那契數

入門訓練 fibonacci數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 fibonacci數列的遞推公式為 fn fn 1 fn 2,其中f1 f2 1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,...