問題:
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) else } 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。輸出格式 輸出一行,...