Fibonacci 实现的3种方法

来源:互联网 发布:如何淘宝 买高仿包 编辑:程序博客网 时间:2024/06/15 22:19

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

定义如下:

第一种方法:

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

long long fibonacci1(int n){if(0==n||1==n)return n;elsereturn 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 0
原创粉丝点击