Fibonacci 实现的3种方法

斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……

定义如下:

第一种方法:

在当初第一次接触递归的时候,例子就是Fibonacci数的计算。实现代码如下:

long long fibonacci1(int n)
{
	if(0==n||1==n)
		return n;
	else
		return fibonacci1(n-1)+fibonacci1(n-2);
}


第二种方法:

通过使用两个额外的空间换取时间的方法来改善第一种方法。实现代码如下:

long long fibonacci2(int n)
{
	long long result=0;
	long long fn_1,fn_2;
	fn_1=0;
	fn_2=1;
	if(0==n||1==n)
		return n;
	else
	{
		for(int i=1;i<n;i++)
		{
			result=fn_1+fn_2;
			fn_1=fn_2;
			fn_2=result;
		}
	}
	return result;
}

第三种方法:

根据矩阵的乘法

实现代码如下:

//矩阵结构体
struct Matrix2_2
{
	Matrix2_2(long long m00=0,long long m01=0,long long m10=0,long long m11=0)
		:m_00(m00)
		,m_01(m01)
		,m_10(m10)
		,m_11(m11)
	{	
	}
	long long m_00;
	long long m_01;
	long long m_10;
	long long m_11;
};

//矩阵相乘
Matrix2_2 MatrixMultiply(const Matrix2_2 &matrix1,const Matrix2_2 &matrix2)
{
	return Matrix2_2(
		matrix1.m_00*matrix2.m_00+matrix1.m_01*matrix2.m_10,
		matrix1.m_00*matrix2.m_01+matrix1.m_01*matrix2.m_11,
		matrix1.m_10*matrix2.m_00+matrix1.m_11*matrix2.m_10,
		matrix1.m_10*matrix2.m_01+matrix1.m_11*matrix2.m_11
		);
}

//求{1,1,1,0}^(n-1)的矩阵
Matrix2_2 MatrixPower(int n)
{
	assert(n>0);

	Matrix2_2 matrix;
	if(1==n)
		matrix=Matrix2_2(1,1,1,0);
	else if(0==n%2)
	{
		matrix=MatrixPower(n/2);
		matrix=MatrixMultiply(matrix,matrix);
	}
	else if(1==n%2)
	{
		matrix=MatrixPower((n-1)/2);
		matrix=MatrixMultiply(matrix,matrix);
		matrix=MatrixMultiply(matrix,Matrix2_2(1,1,1,0));
	}
	return matrix;
}

long long  fibonacci3(int n)
{
	if(0==n||1==n)
		return n;
	Matrix2_2 matrix=MatrixPower(n-1);
	return matrix.m_00;
}









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值