斐波那契数列的优化

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

而且当递归的深度异常大时,很容易造成栈溢出。
例如,当用斐波那契数列的第六项时,会计算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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值