尾调用优化是否适用于递归调用以外的调用?

Does tail-call optimization apply to calls other than recursive calls?

请帮助纠正我的理解,即尾调用优化仅适用于递归调用。令我困惑的是这个词只是 "tail-call optimization" 而不是 "recursive tail-call optimization".

或者这个术语指的是一般尾调用发生的一些其他优化?

这将取决于实现和编译器 - 但事实是,它可以用于任何尾调用,而不仅仅是递归调用。

任何递归调用都可以轻松地内联方法,即使它不是方法本身。

它的一个特殊好处是相互递归调用:

f(n):
   //some code
   g(n)
g(n):
   //some more code
   f(n-1)

问题是 "what and how to optimize",我们是否应该只 "cancel" g,并使 f 递归?

幸运的是,这个问题相对简单并且可以通过简单的图算法解决,这要归功于如果每个方法都是一个节点 - 它最多有一个传出边(单尾调用)。这意味着该图实际上是一系列链,在"worst case"处形成一个简单的循环(每个连接的组件中的单个循环),这很容易处理。