fibonacci(斐波那契)數列定義:
(1)遞迴實現
思想簡單,無需贅述,實現如下:
// 遞迴方法複雜度o(2^n),計算到n=41已達到計算機的極限
int f( int n )
int* fibonacci1( int len )
該方法存在很多重複計算,雖然是典型的遞迴,但效率很低,資源消耗大。經分析,改演算法時間複雜讀為指數階(o(2^n)),遠高於多項式階;占用計算機空間資源大,經測試在n=41時已達到pc的極限。
(2)採用通項公式計算
遞推公式為x(n+2)=x(n+1)+x(n),是乙個二階常係數齊次線性差分方程,利用該差分方程的特徵方程t^2=t+1,以及初始條件x(0)=1, x(1)=1易解出x(n)的通項表示式。
f(n)的通項表示式:
c實現:
struct data
;// 利用通項公式計算,時間複雜度o(n)
int* fibonacci2( int len )
; int* arr = (int*)malloc( sizeof(int) * len);
if ( arr == null ) return arr;
for ( int i = 0; i < len; ++i )
return arr;
}
雖然採用通項公式的演算法能以o(1)的時間複雜度計算fibonacci數列,但引入了浮點數,計算精度無法保證。
(3)採用二階遞推的方法
注意到,存在矩陣a=(1,1;1,0)使得下式成立
據此得到fibonacci數列的實現**:
// 用於迭代操作的2x2矩陣
class matrix
matrix(int a1, int b1, int c1, int d1):a(a1),b(b1),c(c1),d(d1){}
matrix( const matrix& b ):a(b.a),b(b.b),c(b.c),d(b.d){}
const matrix& operator*=( const matrix& b)
unsigned int a;
unsigned int b;
unsigned int c;
unsigned int d;
};const matrix operator*( const matrix& a, const matrix& b)
void printmatrix( const matrix& a )
matrix matrixpower( const matrix& a, int n )
return m;
}int f3(int n)
int* fibonacci3( int len )
return arr;
}
該演算法時間複雜度為o(logn). Fibonacci數列的遞迴與非遞迴實現演算法詳解
遞迴演算法 因為遞迴需要不斷的呼叫自身,當n過大的時候,程式將會很慢效率不高,不推薦使用,關於遞迴實現演算法,也很簡單,很多教科書上都是這種解法。遞迴演算法 long long fibonacci unsigned int n 非遞迴演算法 我主要講述一下非遞迴演算法的實現,非遞迴演算法是比較實用的...
Fibonacci數列 遞推 遞迴
無窮數列1,1,2,3,5,8,13,21,34,55,稱為fibonacci數列。它可以遞迴地定義為 第n個fibonacci數可遞迴地計算如下 int fibonacci int n 編寫完整的主函式,分別記錄利用上述遞迴函式求第45,46,47,48個fibonacci數所花費的時間。程式 p...
遞迴 迴圈實現Fibonacci數列
程式實現的 1 1 2 3 5 8 13 21 34 55 這麼乙個數列的功能 數列索引index 1,2 n 方法一 利用函式遞迴實現fibonacci數列 include include define n 10 static int print fibonacci int index int m...