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 是否优化尾递归?
基础教程推荐
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
