斐波那契数列最优解

来源:互联网 发布:体脂称 知乎 编辑:程序博客网 时间:2024/06/06 01:55

波那契数列的通俗解法是利用递推公式进行递归求解,我们可以更优化的去解决它。

方法一:通项公式

斐波那契数列的递推公式是f(n)=f(n-1)+f(n-2),特征方程为:x2=x+1,解该方程得(1+sqrt(5))/2,(1-sqrt(5))/2.所以f(n)=Ax1n+Bx2n,带入f(0)=0,f(1)=1得A=sqrt(5)/5,B=-sqrt(5)/5.则f(n)求出。

int FBi(int i){if (i<2)return i==0?0:1;return FBi(i-1)+FBi(i-2);}


方法二:分治策略

可以看出斐波那契数列有如下性质:

(fn fn-1)=(fn-1 fn-2)*A,可以得出A=(1 1;1 0)

递推可得:(fn fn-1)=(fn-1 fn-2)*A=(fn-2 fn-3)*A2=…=(f1 f0)*An-1

因此问题转化为n次幂的问题,因此幂运算有这样的性质ca+b=ca*cb,而n次幂的n可以拆成二进制的加法,所以只需要logn次遍历即可。代码如下:

Matrix MatrixPow(const Matrix& base,int exponent){    Matrix temp=base;    Matrix result=Identity;    for(;exponent;exponent>>=1)    {        if(exponent&0x1)           result*=temp;        temp*=temp;    }    return result;}  int Fibonacci(int n){     Matrix A={1,1,1,0};     Matrix a=MatrixPow(A,n-1);     return 1*a[0][0]+0*a[1][0];}