手写算法系列——斐波那契数列

版权声明:欢迎转载,转载请注明出处:土豆洋芋山药蛋 https://blog.csdn.net/qq_33414271/article/details/81394593

感觉能够手写各种算法是一件很牛逼的事情,所以开始慢慢练习手写代码,刚开始先找一个容易理解的方式背一背,慢慢再看效果。

斐波那契数列是一个很经典的算法,实现起来很容易,主要是要理解它的算法复杂度,以下用一张图总结以下手写要点:
这里写图片描述

那么斐波那契数列有咩有时间复杂度更低的实现方式呢?答案是有的,下面就介绍一种时间复杂度位O(log n)的思路:矩阵法。

这里写图片描述

利用矩阵可以很好地将数列问题转化为矩阵问题,而矩阵的问题呢,又可以把计算矩阵的(n-2)次方,我们又可以进行分解,即计算矩阵(n-2)/2次方的平方,逐步分解下去,由于折半计算矩阵次方,因而时间复杂度为O(log n)

递归法和循环法实现代码:

#include <stdio.h>
/*
斐波那契数列问题
1   1   2   3   5   8   13.... 
*/ 

//产生第n项元素——递归方法 
int F1 (int n)
{
    return n<2?n:F1(n-1)+F1(n-2);
}
//产生第n项元素——循环方法
int F2(int n)
{
    int a=1;
    int b=1;
    int result=1;
    for(int i=2;i<n;i++)
    {
        result=a+b;
        a=b;
        b=result;
    }   
    return result;
}
//主函数 
int main()
{
    printf("F1: %d \n",F1(7));
    printf("F2: %d \n",F2(7));

    //求斐波那契数列的和
    int index=5;
    int sum_1=0;
    int sum_2=0;
    for(int i=1;i<=index;i++) 
    {
        sum_1+=F1(i);
        sum_2+=F2(i);
    }
    printf("求和结果:sum_1=%d   sum2=%d",sum_1,sum_2);
} 

参考:
https://blog.csdn.net/beautyofmath/article/details/48184331
https://blog.csdn.net/dangzhangjing97/article/details/78778536

猜你喜欢

转载自blog.csdn.net/qq_33414271/article/details/81394593