斐波那契数列,又称黄金分割数列,指的是这样一个数列: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;
}