Fibonacci數列的遞迴與非遞迴實現

2021-06-05 05:49:18 字數 1470 閱讀 4329

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...