斐波那契数列

斐波那契数列

 

斐波那契数列的三种求法:

 

 

  1. 第一种:暴力求解

 

 

#include<iostream>

using namespace std;

 

long Fibonacci(int n)

{

   if(n == 0)

       return 0;

   if(n == 1)

       return 1;

   long pre = 0;

   long lat = 1;

   long fib = 0;

    intcnt = 1;

   while(cnt < n)

    {

       fib = pre + lat;

       pre = lat;

       lat = fib;

       ++cnt;

    }

   return fib;

}

 

int main()

{

   cout << "请输入数列的长度:";

    intn;

    cin>> n;

   cout << Fibonacci(n) << endl;

   return 0;

}

 

 

 

 

(2)第二种是递归法:

 

Fn= 0                n=0

        1                n=1

        F(n-1) + F(n-2)    n>=2

 

 

#include<iostream>

using namespace std;

 

long Fibonacci(int n)

{

   if(n == 0)

       return 0;

   else if(n == 1)

       return 1;

   else

       return Fibonacci(n-1) + Fibonacci(n-2);

}

 

int main()

{

   cout << "请输入数列长度:";

    intn = 0;

    cin>> n ;

   cout << Fibonacci(n) << endl;

   return 0;

}

 

 

 

 

 

 

(3)第三种是最高效的O(nlgn)的算法

 

 

 

看到这么一个a^n的式子,我们应该都很熟悉,可以直接用分治的方法来提高效率!

具体的我们可以用数学归纳法证明(此处省略证明,直接上代码)

 

#include<iostream>

#include<string>

using namespace std;

 

//定义2×2矩阵;

struct Matrix2by2

{

    //构造函数

   Matrix2by2

    (

       long m_00,

       long m_01,

       long m_10,

       long m_11

    )

   :m00(m_00),m01(m_01),m10(m_10),m11(m_11)

    {

    }

 

    //数据成员

   long m00;

   long m01;

   long m10;

   long m11;

};

 

//定义2×2矩阵的乘法运算

Matrix2by2 MatrixMultiply(constMatrix2by2& matrix1,const Matrix2by2& matrix2)

{

   Matrix2by2 matrix12(1,1,1,0);

   matrix12.m00 = matrix1.m00 * matrix2.m00 + matrix1.m01 * matrix2.m10;

   matrix12.m01 = matrix1.m00 * matrix2.m01 + matrix1.m01 * matrix2.m11;

   matrix12.m10 = matrix1.m10 * matrix2.m00 + matrix1.m11 * matrix2.m10;

   matrix12.m11 = matrix1.m10 * matrix2.m01 + matrix1.m11 * matrix2.m11;

   return matrix12;

 

}

 

 

//定义2×2矩阵的幂运算

Matrix2by2 MatrixPower(unsigned int n)

{

   Matrix2by2 matrix(1,1,1,0);

   if(n == 1)

    {

       matrix = Matrix2by2(1,1,1,0);

    }

   else if(n % 2 == 0)

    {

       matrix = MatrixPower(n / 2);

       matrix = MatrixMultiply(matrix, matrix);

    }

   else if(n % 2 == 1)

    {

       matrix = MatrixPower((n-1) / 2);

       matrix = MatrixMultiply(matrix, matrix);

       matrix = MatrixMultiply(matrix, Matrix2by2(1,1,1,0));

    }

   return matrix;

}

//计算Fibnacci的第n

long Fibonacci(int n)

{

   if(n == 0)

       return 0;

   if(n == 1)

       return 1;

 

   Matrix2by2 fibMatrix = MatrixPower(n-1);

   return fibMatrix.m00;

 

}

 

int main()

{

   cout << "请输入数列的长度:" << endl;

    intn;

    cin>> n;

   cout << Fibonacci(n) << endl;

   return 0;

}





转载出处http://www.cnblogs.com/python27/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值