个人而言,我非常重视尾调用优化;主要是因为它使递归与迭代一样高效(或者说将迭代作为递归的子集)。在极简语言中,你可以获得巨大的表达能力,而不会牺牲性能。
然而,在“实用”语言(如Python)中,通常有许多其他构造可用于几乎所有情况,因此它不那么关键。当然,它总是一个好东西,可以应对未预见的情况。
个人而言,我非常重视尾调用优化;主要是因为它使递归与迭代一样高效(或者说将迭代作为递归的子集)。在极简语言中,你可以获得巨大的表达能力,而不会牺牲性能。
然而,在“实用”语言(如Python)中,通常有许多其他构造可用于几乎所有情况,因此它不那么关键。当然,它总是一个好东西,可以应对未预见的情况。
如果你非常想使用递归来完成可以用循环实现的事情,那么“尾调用优化”确实是必须的。然而,Python的至高无上的独裁者(BDFL)Guido强烈主张使用循环来表达循环 - 因此他不会特别处理尾调用(牺牲堆栈跟踪转储和调试的一致性)。
尾调用优化可以更轻松地编写递归函数,而不必担心堆栈溢出问题:
def fac(n, result=1):
if n > 1:
return fac(n - 1, n * result)
return result
Guido在后续的帖子中指出,TCO允许将状态机实现为相互递归调用的函数集合,这样可以更加清晰地编写代码。然而,在同一篇文章中,他提出了一种同样清晰的替代方案,而不需要使用TCO。