请帮助纠正我的理解,即尾部调用优化仅适用于递归调用。让我感到困惑的是,这个词只是"尾调用优化"而不是"递归尾调用优化"。
或者是否有一些其他优化通常发生在尾部调用中,这个术语指的是?
答案 0 :(得分:3)
这将依赖于实现,并且依赖于编译器 - 但事实是,它可以用于任何尾调用,而不仅仅是递归调用。
对任何递归调用都可以轻松地内联方法,即使它不是方法本身。
它的一个特殊好处是相互递归调用:
f(n):
//some code
g(n)
g(n):
//some more code
f(n-1)
问题是“什么以及如何优化”,我们应该“取消”g,并使f递归吗?
幸运的是,这个问题相对简单,并且可以通过简单的图算法解决,这要归功于如果每个方法都是一个节点 - 它最多只有一个传出边(单尾调用)。这意味着图形实际上是一系列链,它们在“最坏情况”下形成一个简单的循环(每个连接组件中的单个循环),这很容易处理。