递归的缺陷

递归的缺陷

   递归的本质就是压栈和出栈的过程。


  递归虽然简洁,但是它也有显著的缺点。递归由于是函数调用自身,而函数调用是有时间和空间消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址及临时变量,而且往栈中压入数据和弹出数据都需要时间。

一、效率
  递归中有可能很多计算都是重复的,从而对性能带来很大的影响。递归的本质是把一个问题分解成多个小问题。如果多个小问题存在相互重叠的部分,那么就存在重复的计算。比如“斐波那契数列”。


二、空间
   除了效率之外,递归还有可能引起更严重的问题:调用栈溢出。每个进程的栈的容量是有限的,当递归调用的层级太多时,就会超出栈的容量,从而导致栈举出。

斐波那契数列
#include <iostream>

// 斐波那契数列递归写法,时间复杂度以n的指数方式递增。
long long Fibonacci(unsigned n)
{
    if (n <= 0)
        return 0;
    if (n == 1)
        return 1;

    return Fibonacci(n - 1) + Fibonacci(n - 2);
}

// 斐波那契数列用循环实现,时间复杂度是O(n)。
long long Fibonacci(unsigned n)
{
    int res[] = {0,1};
    if (n < 2)
        return  res[n];

    long long first = 0;
    long long second = 1;
    long long result = 0;
    for (unsigned i = 2; i <= n; ++i) {
        result = first + second;
        first = second;
        second = result;
    }

    return result;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值