如何在Python中实现尾递归优化(支持尾递归优化的语言)
5542023-08-21
大家好,如果您还对如何在Python中实现尾递归优化不太了解,没有关系,今天就由本站为大家分享如何在Python中实现尾递归优化的知识,包括不建议使用尾递归的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
本文目录
子程序递归程序设计方法的要点
1)对于含有递归特征的问题,最好设计递归形式的算法。但也不要单纯追求形式。应在算法设计的分析过程中“就事论事”。例如,在利用分割求解设计算法时,子问题和原问题的性质相同;或者,问题的当前一步解决之后,余下的问题和原问题性质相同,则自然导致递归求解。
2)实现递归函数,目前必须利用“栈”。一个递归函数必定能改写为利用栈实现的非递归函数,反之,一个利用栈实现的非递归函数可以改写为递归函数。需要注意的是递归函数递归层次的深度决定所需存储量的大小。
3)分析递归算法的工具是递归树,从递归树上可以得到递归函数的各种相关信息。例如:递归树的深度即为递归函数的递归深度;递归树上的结点数目恰为函数中的主要操作重复进行的次数;若递归树蜕化为单支树或者递归树中含有很多相同的结点,则表该递归函数不适用。
4)递归函数中的尾递归都是可以容易消除的。
5)递归函数一定要有一个递归出口。即整个递归函数应该是收敛的。规模应该越来越小。
递归本质是压栈,一般是为了提高代码逻辑的清晰度,并不会提高运行效率,要尽量使用尾递归,对于动态规划等,需要使用备忘录或dp表去优化时间复杂度,减少重复计算逻辑。
1.递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间。->效率
2.递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。->效率
3.调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。->性能
python没有针对尾递归做优化,递归深度最大默认深度1000左右,当然你可以修改它的底层默认最大深度值。但是我们可以用python内置的yield把尾递归函数改造成一个生成器,我只要不断执行__next__()方法就行了。下面有帖一个自己写的
文章到此结束,如果本次分享的如何在Python中实现尾递归优化和不建议使用尾递归的问题解决了您的问题,那么我们由衷的感到高兴!