題目:定義
fibonacci
數列如下:
:看到斐波那契數列幾乎所有的程式設計師在第一時間的反應都是「遞迴」,沒錯了,作為和漢諾塔一樣的經典遞迴問題,我們幾乎毫不猶豫就可以寫出如下的**:
1 #include2 #include然而我們不禁要問:雖然用這道題使得遞迴變得容易理解,那麼這道題用遞迴是最好的嗎?我們用計算3using
namespace std;45
long fibonacci(unsigned int n)
6 14
15int main()
16
f(10)
來說明:
從圖中可以看出:在計算
f(10)
要計算f(9)
和f(8)
,二要計算
f(9)
,又要計算
f(8)
,以此類推,要計算很多重複的值,這樣就浪費了時間,而計算重複值的數量隨著
n值而急劇增大,事實上該演算法的時間複雜度隨著
n值呈指數增長。不信,大家可以取
n=100
看看遞迴要慢到什麼程度。
分析2:既然上面演算法的主要缺點是要重複的計算很多不必要的數值,那麼我們的想法是不計算那些重複的值,我們考慮對於任意乙個
n值,我們從第一項開始,不斷的累積下去,這樣就可以避免重複計算。由於是從第一項逐次求解,所以該演算法的時間複雜度為
o(n)
。**如下:
1 #include2 #include分析33using
namespace std;45
long fibonacci(unsigned int n)
6 22
return fib;
23 }
2425
int main()
26
:最後介紹一種效率最高的演算法
o(logn)
,首先我們有下面的數學公式:
我們可以用數學歸納法證明如下:
step1: n=2時
step2
:設n=k
時,公式成立,則有:
等式兩邊同乘以
[1,1;1,0]
矩陣可得:
右,這正是
n=k+1
時的形式,即當
n=k+1
時等式成立。 由
step1
和step2
可知,該數學公式成立。
由此可以知道該問題轉化為計算右邊矩陣的
n-1冪問題。
我們利用分治的演算法思想可以考慮如下求解乙個數
a的冪。
實現這種演算法需要定義矩陣,以及矩陣的有關運算,具體**如下:
1 #include2 #include微軟、google等面試題:3using
namespace std;45
//定義2×2矩陣;
6struct matrix2by2
7 19
20//
資料成員
21long m00;
22long m01;
23long m10;
24long m11;
25 };
2627
//定義2×2矩陣的乘法運算
28 matrix2by2 matrixmultiply(const matrix2by2& matrix1,const matrix2by2& matrix2)
29 38
3940
//定義2×2矩陣的冪運算
41 matrix2by2 matrixpower(unsigned int n)
42 48
else
if(n % 2 == 0)
49
53else
if(n % 2 == 1)
54
59return matrix;
60 }
61//
計算fibnacci的第n項
62long fibonacci(unsigned int n)
63 73
74int main()
75
注: 1)本部落格所有的**環境編譯均為win7+vc6。所有**均經過博主上機除錯。
2)博主
python27
3種方法求解斐波那契數列
題目 定義 fibonacci 數列如下 看到斐波那契數列幾乎所有的程式設計師在第一時間的反應都是 遞迴 沒錯了,作為和漢諾塔一樣的經典遞迴問題,我們幾乎毫不猶豫就可以寫出如下的 include includeusing namespace std long fibonacci unsigned i...
斐波那契數列求解
斐波那契數列是一種常見的數列,其滿足下面兩個條件 f0 f1 1 fn fn 1 fn 2 斐波那契數列求解def fib1 n if n 2 return 1 return fib1 n 1 fib1 n 2 不適用遞迴 python def fib2 n f1 f2 1 for i in ran...
Matlab求解斐波那契數列
下面是乙個matlab的指令碼函式,用於求解菲波那切數列,而且可以判斷輸入是否符合實際情況 function fibona n 斐波那契數列,前兩項之和等於第三項 f n f n 1 f n 2 第一項和第二項分別都是1 f 1 1,f 2 1 程式主題 if n 3 disp n warning ...