【发布时间】:2015-02-23 09:43:31
【问题描述】:
我有一个关于尾调用优化的问题,我需要知道这段 java 代码的行为方式:
private void doSomething(int v) {
inf f = someCalculation(v);
if (f < 0) doSomething(v/2);
else doSomething(v*2);
}
这段代码是一个无意义的例子,但我的问题是,在这种情况下:
- 第一个 doSomething() 调用会被优化吗?
- 第二个 doSomething() 调用会被优化吗?
- if/else 块以任何方式影响优化?
谢谢
编辑:
请提供一个示例,说明如果语言不是 Java 而是其他具有 TCO 的语言,您将如何做到这一点
【问题讨论】:
-
最后两行可以改写为
doSomething((f < 0) ? (v/2) : (v*2));... -
那么您的问题到底出在哪里?共有三个问题,请尝试提供答案。
-
首先:优化几乎从不保证。当代码“及时”优化时,可以优化的事实并不意味着它会优化,尤其是在 Java 中。
-
@GiulioFranco 尾调用优化是一个定义明确的概念,确定性(和静态)应用于支持它的语言。事实上,它是如此普遍,以至于支持它的语言可以称为“TCO 语言”。
-
@MarkoTopolnik 所有(或许多)优化都是一个定义明确的概念。通常不容易做的是确定这个概念是否适用于我们编写的代码。如果某些语言标准化了 tco 适用且必须应用的条件,那我不知道。
标签: java recursion tail-call-optimization tail-call