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

原创 2012年03月23日 11:24:29

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

该方法存在很多重复计算,虽然是典型的递归,但效率很低,资源消耗大。经分析,改算法时间复杂读为指数阶(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
{
	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;
}

虽然采用通项公式的算法能以O(1)的时间复杂度计算Fibonacci数列,但引入了浮点数,计算精度无法保证。


(3)采用二阶递推的方法

注意到,存在矩阵A=(1,1;1,0)使得下式成立



据此得到Fibonacci数列的实现代码:

// 用于迭代操作的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;
}
该算法时间复杂度为O(logN).

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

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

Fibonacci (斐波那契数列)-循环,递归实现方式

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

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

有一对兔子,他们每一个月生一对小兔子,新生的小兔子两个月就长大了,在第二个月的月底就开始生他们的下一代小兔子,这样一代一代生下去。求解兔子增长的数量的数列。 问题可以抽象成下列数学公式:Un = ...
  • smile_YangYue
  • smile_YangYue
  • 2017年02月23日 21:57
  • 975

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

一、基础概念: 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F...
  • zhangchaoq
  • 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
  • qq_29486343
  • 2015年07月25日 21:52
  • 780

算法——Fibonacci数列的多种解法(递归算法)

咳咳,金宸欧巴今天来更新博客了,今天想写的一点内容是关于斐波那契数列的解法,fibonacci数列的定义如下:F(n)= { a, ...
  • JacksonWant
  • JacksonWant
  • 2016年04月14日 01:02
  • 3965

斐波那契数列递归与非递归实现(JAVA语言描述)

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1] )以兔子繁殖为例子而引入,故又称为“兔子数列”,指...
  • u012712901
  • 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
  • Gongxs7
  • 2015年10月30日 23:33
  • 284

Fibonacci(斐波那契)数列的递归与非递归实现 python

关于递归算法,可以参考这篇文章 汉诺塔 经典递归算法 in python Fibonacci数列为:0、1、1、2、3、5、8、13、21...... 数列第一项为0,第二项为1,从第三项开始,每...
  • u014496330
  • u014496330
  • 2015年03月26日 15:48
  • 4227

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

fibonacci数列的递归与非递归实现 public class fibonacci { public static void main(String arg[]){ // f...
  • sun11462
  • sun11462
  • 2015年08月20日 11:16
  • 218
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Fibonacci数列的递归与非递归实现
举报原因:
原因补充:

(最多只允许输入30个字)