3種方法求解斐波那契數列

2021-06-08 21:20:14 字數 2644 閱讀 9226

題目:定義

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

3using

namespace std;45

long fibonacci(unsigned int n)

6 22

return fib;

23 }

2425

int main()

26

分析3

:最後介紹一種效率最高的演算法

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

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

微軟、google等面試題:

注: 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 ...