Fibonacci數列三種方式求解及其複雜度分析

2021-09-17 01:15:52 字數 1903 閱讀 3098

目錄

一、遞迴求解

複雜度分析

解法缺點

二、解決重複計算方式 思路

時間複雜度

三、利用數學公式o(logn)解法

o(n)解法

o(logn)解法

public static int fibonacci(int x)
設f(n)為引數為n時的時間複雜度,很明顯:f(n)=f(n-1)+f(n-2) 。這就轉化為了數學上的二階常係數差分方程,並且為齊次方程。 

即轉化為了求f(n)的值,f(n)=f(n-1)+f(n-2)且f(0)=0; f(1)=1; 特徵方程為:x^2-x-1=0 ,得 x=(1±√5)/2 。因而f(n)的通解為: 

由f(0)=0; f(1)=1可解得c_1,c_2 最終可得,時間複雜度為:

遞迴本質是棧,當引數達到一定大小的時候棧會溢位;

計算fibonacci(n)就需要計算fibonacci(n-1)和fibonacci(n-2),這期間存在著大量的計算重複;

時間複雜度為指數級

public static int fibonacci_1(int x) 

return result;

}

從下往上計算,將中間值儲存起來,避免了重複計算。

o(n)

斐波那契數列的遞推公式:

由此可以得到

當n>=2時,上式也成立,由此得到

我們從0開始,直到n-1計算矩陣的n-1次冪,時間複雜度仍然是o(n)

public static long fibonacci_2(int x) ,};

long matrix = calpowerofmatrix(basicmatrix, x - 1);

return matrix[0][0];

} public static long calpowerofmatrix(long matrix, int n)

return matrix;

}

乘方是具有以下性質:

可以利用這個公式使用二分法來遞迴實現斐波那契數列的求解,複雜度可以達到o(logn)

public static long fibonacci_3(int x) ,};

long matrix = calpowerofmatrix2(basicmatrix, x - 1);

return matrix[0][0];

} private static long calpowerofmatrix2(long matrix, int n)

private static long calbasicmultipyofmatrix(long matrix)

private static long calsquareofmatrix(long matrix)

參考

求Fibonacci數列的三種方法

fibonacci數列 0,1,1,2,3,5,8,13。第一招 遞推法 includeint f 47 int main 第二招 不斷變換初始 include int main if n 1 n 2 puts 1 else if n 0 puts 0 else printf d n f3 retu...

Fibonacci數列的生成(4種方式)

1.定義 斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞迴的方法...

Fibonacci數列的兩種實現方式

斐波那契數列的形式為 1,1,2,3,5,8,13,21.從第三項開始,後面的每一項都是前面兩項的和。實現的方式有一下 兩種 一 遞迴方式實現 def fib n if n 1 print 數值錯誤!return 1 if n 1 or n 2 return 1 return fib n 1 fib...