斐波那契數列: 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 遞迴的方法求斐波拉契數列 優點簡單明瞭,缺點當所求數過大時占用記憶體...