斐波那契数列
刚开始的时候博主以为用运递归算法几行代码就搞定了,函数很简单,但是当我真正写完测试的时候却发现当输入数字很大的时候计算速度就变得非常非常的慢(这是一个忧桑的问题),于是又尝试着通过另外一种方法将其解决,通过分析得到在计算过程中有些步骤是大量重复的,比如要计算f(10)就要递归调用f(9),f(8),但是在计算f(9)的时候又要调用f(8)一次,这样子的话显然会拖慢程序的运行速率,所以在这里倒着计算可以很好地避免这一现象的发生。
首先计算f(0),f(1)然后通过这两个可以得到f(2),然后又由f(1),f(2)可以得到f(3)以此类推即可。
以下是博主呕心沥血总结出来的四种写法,写的不好的地方请多多关照哦:
#include<iostream>
using namespace std;
//
int Fib1(int n)
{
if(n<2)
{
return n;
}
return Fib1(n-1)+Fib1(n-2);
}
//
long long Fib2(size_t n)
{
return n<2?n:Fib2(n-1)+Fib2(n-2);
}
//
long long Fib3(size_t n )
{
if(n<2)
{
return n;
}
long long first=0;
long long second=1;
long long ret=0;
for(size_t i=1;i<n;i++)
{
ret=first+second;
first=second;
second=ret;
}
return ret;
}
//
long long Fib4(size_t n)
{
//因为数组下表是从0开始所以要是N+1
long long *a=new long long [n+1];
a[0]=0;
a[1]=1;
for(size_t i=2;i<=n;i++)
{
a[i]=a[i-1]+a[i-2];
}
return a[n];
}
int main()
{
cout<<Fib4(4)<<endl;
system("pause");
return 0;
}