Fibonacci Number (斐波那契數列)

2021-06-08 11:41:18 字數 1007 閱讀 8994

問題:

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 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 multiply(pow(n/2), pow(n/2));

else return multiply(multiply(pow(n/2), pow(n/2)), m);

}public int multiply(int a, int b)

這樣,整個演算法複雜度為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。輸出格式 輸出一行,...