递归带来的问题

递归采用分治的思想,把大问题分成两个或者多个性质一样的小问题来解决;
递归在带来清晰的解题思路时也会产生一系列负面影响。

一、时间和空间上的浪费
函数在调用时,会在用户栈上开辟栈帧来保存函数的参数、返回值以及局部变量;每调用一次函数,便多开一个栈帧空间;并且压栈和出栈都消耗一定的时间。
二、重复计算会降低性能
在分治的时候,小问题如果有些问题是重复的话,递归整体就会重复一定的计算,从而降低整体的性能;
三、栈溢出
此前两个递归带来的问题都在一定程度上时无法避免的;而栈溢出可以采用响应的措施对其进行响应的优化;
因为每一次调用函数,都会在用户栈上开辟栈帧空间,而栈的容量是有限的(Windows默认1M,Linux下默认4M),所以大量的开辟栈帧空间会使栈溢出。
优化(只能是优化而非解决)递归调用栈溢出的方法是通过尾递归优化,其实尾递归和循环的效果是一样的,所以,可以把循环看成是一种特殊的尾递归函数。

尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,而尽可能的减少递归时开辟的空间,使程序不会出现栈溢出的情况。
(如果读者还是没理解我就用白话陈述一遍)
在一个函数a调用另一个函数b时,会给b分配栈帧空间,在b返回时,回到a调用的地方,此间涉及两个栈帧空间;

而把调用语句放在return 时,函数a已经不需要b的返回值了,在给b分配栈帧空间时,就可以把a释放了,在b函数的栈帧上进行相关的操作,此间最后涉及到一个栈帧空间;
经典的例子就是斐波那契数列,可以对其递归进行修改,而对其整体进行优化,改善其时间复杂度;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值