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

Algorithm 尾部调用优化是否适用于递归调用以外的调用?,algorithm,tail-recursion,tail-call-optimization,Algorithm,Tail Recursion,Tail Call Optimization,请帮助纠正我的理解,即尾部调用优化只适用于递归调用。让我困惑的是,这个术语只是“尾部调用优化”,而不是“递归尾部调用优化” 或者,对于这个术语所指的一般尾部调用,还有其他一些优化吗?它将依赖于实现,依赖于编译器-但事实是,它可以用于任何尾部调用,而不仅仅是递归调用 对于任何递归调用,内联方法都可以很容易地完成,即使它不是方法本身 它的一个特殊好处是相互递归调用: f(n): //some code g(n) g(n): //some more code f(n-1) 问

请帮助纠正我的理解,即尾部调用优化只适用于递归调用。让我困惑的是,这个术语只是“尾部调用优化”,而不是“递归尾部调用优化”


或者,对于这个术语所指的一般尾部调用,还有其他一些优化吗?

它将依赖于实现,依赖于编译器-但事实是,它可以用于任何尾部调用,而不仅仅是递归调用

对于任何递归调用,内联方法都可以很容易地完成,即使它不是方法本身

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

f(n):
   //some code
   g(n)
g(n):
   //some more code
   f(n-1)
问题是“什么以及如何优化”,我们是否应该“取消”g,并使f递归


幸运的是,这个问题相对简单,可以通过简单的图算法来解决,这要归功于这样一个事实:如果每个方法都是一个节点,那么它最多有一个传出边(单尾调用)。这意味着图形实际上是一系列链,在“最坏情况”下形成一个简单的循环(每个连接的组件中只有一个循环),这很容易处理。

理论上,它可以用于任何尾部调用。但是,由于调用链越深,您获得的好处就越多,这对于递归来说通常是最有用的。您的示例使尾部调用优化看起来与内联相同,而内联不同。我更喜欢你的答案,因为它没有包含那个误导性的例子。@PascalCuoq更正被接受。谢谢你的反馈。