斐波拉契數列的三種解法

2021-08-05 19:42:38 字數 1725 閱讀 1357

斐波那契數列: 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

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

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;}

斐波拉契數列解法

斐波那契數列的定義是 f n 1 f n f n 1 f n 1 f n f n 1 生成第 nn 項的做法有以下幾種 遞迴法 原理 把 f n f n 問題的計算拆分成 f n 1 f n 1 和 f n 2 f n 2 兩個子問題的計算,並遞迴,以 f 0 f 0 和 f 1 f 1 為終止條件...

斐波那契數列的三種解法

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

三種方法求斐波拉契數列

斐波那契數列 斐波那契數列 1,1,2,3,5,8,13,21,34,55,89,144,如果設f n 為該數列的第n項 n n 那麼這句話可以寫成如下形式 f n f n 1 f n 2 顯然這是乙個線性遞推數列。include 遞迴的方法求斐波拉契數列 優點簡單明瞭,缺點當所求數過大時占用記憶體...