斐波那契数列

    xiaoxiao2021-03-25  143

    斐波那契数列

     

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

     

     

    第一种:暴力求解

     

     

    #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/

    转载请注明原文地址: https://ju.6miu.com/read-12439.html

    最新回复(0)