目錄
一、遞迴求解
複雜度分析
解法缺點
二、解決重複計算方式 思路
時間複雜度
三、利用數學公式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...