2015-07-06 62 views
1

请帮助纠正我的理解,这是一个尾调用优化仅适用于递归调用。令我困惑的是这个术语只是“尾部呼叫优化”而不是“递归尾部呼叫优化”。尾部呼叫优化是否适用于递归调用以外的呼叫?

或者是有这种情况发生在一般尾调用,这个术语指的是一些其他的优化?

+1

理论上它可以被用于任何尾调用。但是,自呼叫链越深,收获越多,它通常对递归最有用。 – biziclop

回答

3

那将是执行相关的,并且依赖于编译器 - 但事实是,它可以被用于任何尾调用,不仅是递归的。

内联的方法可以用于任何递归调用很容易做到,即使它不是方法本身。

这样的特别好处是相互递归调用:

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

的问题是“什么和如何优化”,我们应该只是“取消” G,使˚F递归?

幸运的是,这个问题是相对简单的,并且通过简单的图算法solveable,由于这样的事实,如果每个方法是一个节点 - 它具有至多一个外向边缘(单尾呼叫)。这意味着该图实际上是一系列链,在“最坏情况”下形成一个简单循环(每个连接组件中的单个循环),这很容易处理。

+0

您的示例使它看起来像tail-call优化和内联相同,事实并非如此。当它不包含那个误导性的例子时,我更喜欢你的答案。 –

+0

@PascalCuoq更正接受。感谢您的反馈。 – amit