请帮助纠正我的理解,这是一个尾调用优化仅适用于递归调用。令我困惑的是这个术语只是“尾部呼叫优化”而不是“递归尾部呼叫优化”。尾部呼叫优化是否适用于递归调用以外的呼叫?
或者是有这种情况发生在一般尾调用,这个术语指的是一些其他的优化?
请帮助纠正我的理解,这是一个尾调用优化仅适用于递归调用。令我困惑的是这个术语只是“尾部呼叫优化”而不是“递归尾部呼叫优化”。尾部呼叫优化是否适用于递归调用以外的呼叫?
或者是有这种情况发生在一般尾调用,这个术语指的是一些其他的优化?
那将是执行相关的,并且依赖于编译器 - 但事实是,它可以被用于任何尾调用,不仅是递归的。
内联的方法可以用于任何递归调用很容易做到,即使它不是方法本身。
这样的特别好处是相互递归调用:
f(n):
//some code
g(n)
g(n):
//some more code
f(n-1)
的问题是“什么和如何优化”,我们应该只是“取消” G,使˚F递归?
幸运的是,这个问题是相对简单的,并且通过简单的图算法solveable,由于这样的事实,如果每个方法是一个节点 - 它具有至多一个外向边缘(单尾呼叫)。这意味着该图实际上是一系列链,在“最坏情况”下形成一个简单循环(每个连接组件中的单个循环),这很容易处理。
您的示例使它看起来像tail-call优化和内联相同,事实并非如此。当它不包含那个误导性的例子时,我更喜欢你的答案。 –
@PascalCuoq更正接受。感谢您的反馈。 – amit
理论上它可以被用于任何尾调用。但是,自呼叫链越深,收获越多,它通常对递归最有用。 – biziclop