版权声明:欢迎转载,转载请注明出处:土豆洋芋山药蛋 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