尾部调用优化有什么大不了的以及为什么 Python 需要它?

问题描述 投票:0回答:4

显然,对于 Python 是否需要尾部调用优化 (TCO) 存在很大争议。当有人向 Guido 发送了一份 SICP 副本时,事情达到了紧要关头,因为他没有“得到它”。我和Guido处于同一条船上。我理解尾调用优化的概念。我只是想不出 Python 真正需要它的任何理由。

为了让我更容易理解,使用 TCO 可以大大简化的代码片段是什么?

python tail-recursion tail-call-optimization
4个回答
16
投票

就我个人而言,我非常重视尾调用优化;但主要是因为它使递归与迭代一样高效(或者使迭代成为递归的子集)。在简约语言中,您可以在不牺牲性能的情况下获得巨大的表达能力。

在“实用”语言(如 Python)中,OTOH,您通常对几乎所有可以想象的情况都有很多其他结构,因此它不那么重要。当然,考虑到不可预见的情况,拥有它总是一件好事。


6
投票

如果您非常想将递归用于可能表示为循环的事物,那么“尾部调用优化”确实是必须的。然而,Guido,Python 的仁慈独裁者终生 (BDFL),坚信循环应该被表达为循环——所以他不会进行特殊情况的尾部调用(牺牲堆栈跟踪转储和调试规律性)。


5
投票

尾部调用优化使编写递归函数变得更容易,而不必担心堆栈溢出:

def fac(n, result=1):
        if n > 1:
                return fac(n - 1, n * result)
        return result

如果没有尾部调用优化,用大数字调用它可能会溢出堆栈。


0
投票

Guido 在后续post 中认识到,TCO 允许更干净地实现状态机作为相互递归调用的函数集合。然而,在同一篇文章中,他提出了一种同样清洁的替代解决方案,无需 TCO。

© www.soinside.com 2019 - 2024. All rights reserved.