1.介绍斐波那契数列:
描述:斐波那契数列(Fibonacci sequence),指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n ≥ 2,n ∈ N*)
总之,就是从第三个数开始,接下来的每个数,都是前两个数的相加之和;
2.下面是斐波那契算法的代码演示:
在这里插入代码片:
#include<iostream>
using namespace std;
int Fibonacci(int i)
{
if(i==0)
{
return 0;
}
else if(i==1)
{
return 1;
}
else
{
return Fibonacci(i-1)+Fibonacci(i-2);
}
}
void main()
{
int i,n;
cout<<"请输i的值:"<<endl;
cin>>i;
n=Fibonacci(i);
cout << "输出前几项之和为"<<n<<endl;
}
3.流程图分析斐波那契算法:
从这里我们可以看出,斐波那契的算法中会有较多的重复性运算,使时间复杂度大大增加了,大家可以看一下流程图,这里只用fib(5),就把简单的运算大大增加了,如果我们把所需要求得数字增加,那运算得时间就会大大增加,所以我们可以推出斐波那契的时间复杂度为:
递归算法:T(n)=O(2^n);
4.下面用简单的循环算法与递归算法,解斐波那契作比较:
在这里插入代码片:
#include<iostream>
using namespace std;
int fib(int n)
{
if(n==0)
{
return 0;
}
if(n==1)
{
return 1;
}
int first=0; //第一个值
int second=1; //第二个值
int sum;
if(n>=2)
{
for(int i=2; i<=n; i++) //在循环时间内的计算为:(2n-1)*5+1
{ //所以时间复杂度估算为:T(n)=O(n)
sum=first+second; //将计算的值得出
first=second; //将计算后的值往后覆盖
second=sum;
}
return sum;
}
}
void main()
{
int n,sum;
cout << "请输入所需要输入的值" << endl;
cin >> n;
sum = fib(n);
cout << "计算求和的值为:"<<sum << endl;
}
在这里用循环,时间复杂度是大大减小的,也减少了重复的计算,通过估算的时间,用循环计算斐波那契的时间复杂度为:循环算法:T(n)=O(n);
相同的结果,可以很好的知道哪个方法更好;
在算法中,时间复杂度是越少越好,所以这里用循环解斐波那契会更好:
T(n)=O(n) < T(n)=O(2^n);