递归的优点和缺点

栈的大小是固定的,这也就意味着不能无限的递归。递归到某些时候,栈顶将会没有更多空间

来添加新的栈顶—就好像橱柜的空间被挤满,不能增加一个盘子一样

void recurse()
{
    recurse(); //函数调用其自身
}
int main()
{
    recurse();//开始递归
}
//最终 栈空间会消耗一空,程序将因栈溢出而崩溃

函数相互递归,以阶乘为例:

int factorial_odd (int x)
{
    if(x == 0)
    {
        return  1;
    }
    return factorial_even(x-1);
}

int factorial_even(int x)
{
    if(x == 0)
    {
        return 1;
    }
    return factorial(x-1);
}
int factorial(int x)
{
    if(x%2==0)
    {
        return factorial_even(x);
    }
    else
    {
        return factorial_odd(x);
    }
}
//基线条件没有防负数输入 ,即使调用factorial(-1)会导致这样的
//调用栈 factorial(-1000))

递归需要做许多函数调用,每个函数调用都需要设置有一个栈帧,并传递参数,这些都增加了时间开销,而这些开销循环中没有。绝大多数情况下,现代计算机

中这些开销影响并不显著。但如果你的代码频繁执行(比如短时间内执行百万次甚至上亿次),你必须关注函数调用性能的问题

递归比循环更加强大的地方在于,递归函数维持着一个保存每次递归调用当前状态的栈,允许函数获得子问题的结果后继续处理。

递归算法:将问题分解成更小的版本的相同问题,从而解决问题。

转载于:https://www.cnblogs.com/tchjs/p/4428153.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值