【算法02】3种方法求解斐波那契数列

 

3种方法求解斐波那契数列  第三种分治法 那不太懂

 https://www.cnblogs.com/python27/archive/2011/11/25/2261980.html

分析3:最后介绍一种效率最高的算法O(logn),首先我们有下面的数学公式:

我们可以用数学归纳法证明如下:

Step1: n=2时

Step2:设n=k时,公式成立,则有:

等式两边同乘以[1,1;1,0]矩阵可得:

左=右,这正是n=k+1时的形式,即当n=k+1时等式成立。

由Step1和Step2可知,该数学公式成立。

由此可以知道该问题转化为计算右边矩阵的n-1幂问题。

我们利用分治的算法思想可以考虑如下求解一个数A的幂。

实现这种算法需要定义矩阵,以及矩阵的有关运算,具体代码如下:

#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(const Matrix2by2& 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(unsigned int n)
{
    if(n == 0)
        return 0;
    if(n == 1)
        return 1;

    Matrix2by2 fibMatrix = MatrixPower(n-1);
    return fibMatrix.m00;
    
}

int main()
{
    cout<<"Enter A Number:"<<endl;
    unsigned int number;
    cin>>number;
    cout<<Fibonacci(number)<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值