# Fibonacci数列的递归与非递归实现

Fibonacci(斐波那契)数列定义：

（1）递归实现

// 递归方法复杂度O(2^n)，计算到n=41已达到计算机的极限
int F( int n )
{
if ( n <= 0 ) return 1;
else if ( n == 1 ) return 1;
else return F(n-1)+F(n-2);
}

int* Fibonacci1( int len )
{
int* arr = (int*)malloc( sizeof(int) * len);
if ( arr == NULL ) return arr;

for ( int i = 0; i < len; ++i ) arr[i] = F(i);

return arr;
}

（2）采用通项公式计算

f(n)的通项表达式：

C实现：

struct data
{
double f1;
double f2;
};

// 利用通项公式计算，时间复杂度O(n)
int* Fibonacci2( int len )
{
const double sqrt_5 = sqrt(5.0);
const double p1 = (1+sqrt_5)*0.5;
const double p2 = (1-sqrt_5)*0.5;
data d = {(1+1.0/sqrt_5)/2.0, (1.0/sqrt_5-1)/2.0};

int* arr = (int*)malloc( sizeof(int) * len);
if ( arr == NULL ) return arr;

for ( int i = 0; i < len; ++i )
{
arr[i] = (int)(d.f1-d.f2+0.5);
d.f1 *= p1;
d.f2 *= p2;
}

return arr;
}

（3）采用二阶递推的方法

// 用于迭代操作的2x2矩阵
class matrix
{
public:
matrix():a(1),b(1),c(1),d(0){}
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)
{
int a1 = a, b1 = b, c1 = c, d1 = d;
int a2=B.a, b2=B.b, c2=B.c, d2=B.d;
a = a1 * a2 + b1 * c2;
b = a1 * b2 + b1 * d2;
c = c1 * a2 + d1 * c2;
d = c1 * b2 + d1 * d2;
return *this;
}

unsigned int a;
unsigned int b;
unsigned int c;
unsigned int d;
};

const matrix operator*( const matrix& A, const matrix& B)
{
matrix C(A);
C *= B;
return C;
}

void printMatrix( const matrix& A )
{
printf("%d  %d\n", A.a, A.b);
printf("%d  %d\n", A.c, A.d);
}

matrix matrixPower( const matrix& A, int n )
{
matrix m(1,0,0,1); // 单位矩阵
matrix temp(A);

for ( ; n > 0; n >>= 1 )
{
if ( n&1 ) m *= temp;
temp *= temp;
}

return m;
}

int F3(int n)
{
matrix B(1,1,1,0);
matrix A = matrixPower( B, n-1 );
return A.a + A.c;
}

int* Fibonacci3( int len )
{
int* arr = (int*)malloc( sizeof(int) * len );
if ( arr == NULL ) return arr;

for ( int i = 0; i < len; ++i )
{
arr[i] = F3(i);
}

return arr;
}

• 本文已收录于以下专栏：

## Fibonacci的两种实现方式：递归和递推

// 递归实现方式 public static int fibonacci(int n){ if(n
• shymi1991
• 2014年07月17日 20:01
• 1228

## Fibonacci （斐波那契数列）-循环，递归实现方式

Fibonacci （斐波那契数列）-循环，递归实现方式 #include long fibonacci(int ); long fibonacci_loop(int ); int m...
• changgui5211
• 2015年08月15日 16:13
• 1647

## fibonacci数列的递归C++多种实现

• smile_YangYue
• 2017年02月23日 21:57
• 975

## 【C语言】fibonacci数列 的递归和非递归 +浅谈递归优劣

• zhangchaoq
• 2015年05月10日 15:24
• 4249

## 递归实现求Fibonacci数列的第n项

#include #include #include #include using namespace std; int jich (int x); int main() { int n; ...
• qq_29486343
• 2015年07月25日 21:52
• 780

## 算法——Fibonacci数列的多种解法（递归算法）

• JacksonWant
• 2016年04月14日 01:02
• 3965

## 斐波那契数列递归与非递归实现（JAVA语言描述）

• u012712901
• 2016年03月25日 14:49
• 10237

## 折半查找的递归和非递归实现

#include using namespace std; int BinarySearch(int* arr,int start,int end,int x) { //int low = 0, h...
• Gongxs7
• 2015年10月30日 23:33
• 284

## Fibonacci（斐波那契）数列的递归与非递归实现 python

• u014496330
• 2015年03月26日 15:48
• 4227

## fibonacci数列的递归与非递归实现

fibonacci数列的递归与非递归实现 public class fibonacci { public static void main(String arg[]){ // f...
• sun11462
• 2015年08月20日 11:16
• 218

举报原因： 您举报文章：Fibonacci数列的递归与非递归实现 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)