概述
递归采用分治的思想,把大问题分成两个或者多个性质一样的小问题来解决;
递归在带来清晰的解题思路时也会产生一系列负面影响。
一、时间和空间上的浪费
函数在调用时,会在用户栈上开辟栈帧来保存函数的参数、返回值以及局部变量;每调用一次函数,便多开一个栈帧空间;并且压栈和出栈都消耗一定的时间。
二、重复计算会降低性能
在分治的时候,小问题如果有些问题是重复的话,递归整体就会重复一定的计算,从而降低整体的性能;
三、栈溢出
此前两个递归带来的问题都在一定程度上时无法避免的;而栈溢出可以采用响应的措施对其进行响应的优化;
因为每一次调用函数,都会在用户栈上开辟栈帧空间,而栈的容量是有限的(Windows默认1M,Linux下默认4M),所以大量的开辟栈帧空间会使栈溢出。
优化(只能是优化而非解决)递归调用栈溢出的方法是通过尾递归优化,其实尾递归和循环的效果是一样的,所以,可以把循环看成是一种特殊的尾递归函数。
尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,而尽可能的减少递归时开辟的空间,使程序不会出现栈溢出的情况。
(如果读者还是没理解我就用白话陈述一遍)
在一个函数a调用另一个函数b时,会给b分配栈帧空间,在b返回时,回到a调用的地方,此间涉及两个栈帧空间;
而把调用语句放在return 时,函数a已经不需要b的返回值了,在给b分配栈帧空间时,就可以把a释放了,在b函数的栈帧上进行相关的操作,此间最后涉及到一个栈帧空间;
经典的例子就是斐波那契数列,可以对其递归进行修改,而对其整体进行优化,改善其时间复杂度;
最后
以上就是漂亮保温杯为你收集整理的递归带来的问题的全部内容,希望文章能够帮你解决递归带来的问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复