Does Python optimize tail recursion?(Python 是否优化尾递归?)
问题描述
我有以下代码失败并出现以下错误:
I have the following piece of code which fails with the following error:
RuntimeError: 超出最大递归深度
RuntimeError: maximum recursion depth exceeded
我试图重写它以允许尾递归优化 (TCO).我相信如果发生了 TCO,这段代码应该是成功的.
I attempted to rewrite this to allow for tail recursion optimization (TCO). I believe that this code should have been successful if a TCO had taken place.
def trisum(n, csum):
if n == 0:
return csum
else:
return trisum(n - 1, csum + n)
print(trisum(1000, 0))
我应该断定 Python 不会产生任何类型的 TCO,还是只需要以不同的方式定义它?
Should I conclude that Python does not do any type of TCO, or do I just need to define it differently?
推荐答案
没有,以后也不会了 Guidovan Rossum 更喜欢能够有适当的回溯:
No, and it never will since Guido van Rossum prefers to be able to have proper tracebacks:
尾递归消除 (2009-04-22)
Tail Recursion Elimination (2009-04-22)
尾调用的最后一句话 (2009-04-27)
Final Words on Tail Calls (2009-04-27)
您可以通过如下转换手动消除递归:
You can manually eliminate the recursion with a transformation like this:
>>> def trisum(n, csum):
... while True: # Change recursion to a while loop
... if n == 0:
... return csum
... n, csum = n - 1, csum + n # Update parameters instead of tail recursion
>>> trisum(1000,0)
500500
这篇关于Python 是否优化尾递归?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Python 是否优化尾递归?
基础教程推荐
- 使用PyInstaller后在Windows中打开可执行文件时出错 2022-01-01
- Python kivy 入口点 inflateRest2 无法定位 libpng16-16.dll 2022-01-01
- 如何在海运重新绘制中自定义标题和y标签 2022-01-01
- 在 Python 中,如果我在一个“with"中返回.块,文件还会关闭吗? 2022-01-01
- 如何让 python 脚本监听来自另一个脚本的输入 2022-01-01
- 用于分类数据的跳跃记号标签 2022-01-01
- 线程时出现 msgbox 错误,GUI 块 2022-01-01
- 何时使用 os.name、sys.platform 或 platform.system? 2022-01-01
- Dask.array.套用_沿_轴:由于额外的元素([1]),使用dask.array的每一行作为另一个函数的输入失败 2022-01-01
- 筛选NumPy数组 2022-01-01