關於斐波那契數列三種解法及時間複雜度分析

2021-07-05 01:32:02 字數 1722 閱讀 3988

斐波那契數列: f(n)=f(n-1)+f(n-2); n>=2

f(0)=0; f(1)=1;

即有名的兔子繁衍問題。

斐波那契數列共有三種解法,因而寫這篇文章總結一下。

1. 遞迴求解

遞迴求解比較簡單,是大家常見的一種解法。

int fibonacci(int n)

if (n==1)

return fb(n-1)+fb(n-2);

}

關於這種解法,不再贅述,下面主要說下時間複雜度分析。

設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

最終可得,時間複雜度為:

第一種解法比較簡單,但是多個元素重複計算,因而時間複雜度較高,為了避免重複計算,可進行迴圈計算減少時間複雜度

int fibonacci(int n) 

if (n==1)

intmin=0;

intmax=1;

int i=2;

int result=0;

while (i<=n)

return result;

}

第二種演算法時間複雜度為o(n)

3. 還有一種時間複雜度更低的演算法。

根據上面的遞迴公式,我們可以得到

因而計算f(n)就簡化為了計算矩陣的(n-2)次方,而計算矩陣的(n-2)次方,我們又可以進行分解,即計算矩陣(n-2)/2次方的平方,逐步分解下去,由於折半計算矩陣次方,因而時間複雜度為o(log n)

具體**實現如下:

//

// main.cpp

// fibonaccimatrix

//// created by shunagao on 15/8/31.

//#include

using

namespace

std;

class matrix

n=num;

clear();

}void clear()}}

void unit()

}matrix operator=(const matrix mtx)

matrix operator*(const matrix &mtx)

};int main(int argc, const

char * argv)

first=first*first;

n=n/2;

}cout

<

0;}

斐波那契數列的三種解法

寫乙個函式,輸入n,求斐波那契數列的第n項。斐波那契數列的定義如下 課本的上為了講解遞迴演算法,經常用這個例子。讓我們看一下它的實現 package algorithm public class fibonacci recursion public static void main string a...

斐波那契數列解法

方法一 常規解法 def demo month 定義變數 a,b分別表示一月和二月的數目 a 0 a為第乙個數值 b 1 b為第二個數值 定義乙個計數器 i 0 while i month 列印每次的數值 print a a,b b,a b i 1 nume demo 3 方法二 函式的遞迴 def...

斐波那契數列解法

1 概念 在數學上,費波那契數列是以遞迴的方法來定義 f0 0 f1 1 fn fn 1 fn 2 n 2 用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就是由之前的兩數相加而得出。首幾個費波那契係數是 0,1,1,2,3,5,8,13,21,34,55,89,144,233 oeis...