您的位置:首页 > 其它

斐波那契数列的优化

2017-06-03 11:22 120 查看
学校里变经常用递归的方法来将斐波那契数列,虽然这样的程序很简单,明了,但是他的效率并不高。


而且当递归的深度异常大时,很容易造成栈溢出。

例如,当用斐波那契数列的第六项时,会计算fibo(5)+fibo(4)而计算fibo(5) = fibo(4)+fibo(3)

,而计算fibo(4) = fibo(3)+fibo(2)。所以,造成了fibo(4)和fibo(3)等数值大量的重复计算。

所以可以用其他的方式替代,例如循环和查表。

循环一会举例说明。现在来简单介绍一下查表。构建一个二维数组表,或者一维数组,当

递归到变量的值得时候,首先查表,表中没有,则继续,并将继续的结果放到表里边。如果表中

已经存在,则直接取值。

接下来我举例说明循环方法的效率和递归的效率。

int num = 0;
int Fibonacci(int x)// 递归
{
if(x <= 0)
{
cout<<"error\n"<<endl;
exit(1);
}
else if(x == 1 || x == 2)
return 1;
num++;
return Fibonacci(x-1)+Fibonacci(x-2);
}
int main()
{
int x;
while(cin>>x && x!=-1)
{
cout<<"Fibonacci:"<<Fibonacci(x)<<endl;
cout<<"num:"<<num<<endl;
}
return 0;
}




计算fibo(10),递归次数num = 54.

int num = 0;
int Fibonacci_cycle(int x)
{
if(x <= 0)
return 0;
else if(x == 1 || x == 2)
return 1;
int first = 1;
int second = 1;
for(int i = 3; i <= x; ++i)
{
int tmp = second;
second += first;
first = tmp;
num++;
}
return second;
}
int main()
{
int x;
while(cin>>x && x!=-1)
{
cout<<"Fibonacci:"<<Fibonacci_cycle(x)<<endl;
cout<<"num:"<<num<<endl;
num = 0;
}
return 0;
}




计算fibo(10),循环方法计算次数num = 8.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: