学校里变经常用递归的方法来将斐波那契数列,虽然这样的程序很简单,明了,但是他的效率并不高。
而且当递归的深度异常大时,很容易造成栈溢出。
例如,当用斐波那契数列的第六项时,会计算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.