Java中的尾递归优化和递归

Fra*_*oni 1 java recursion tail-call tail-call-optimization

我有一个关于尾调用优化的问题,我需要知道这个 java 代码的行为方式:

private void doSomething(int v) {

    inf f = someCalculation(v);

    if (f < 0) doSomething(v/2);
    else doSomething(v*2);

}
Run Code Online (Sandbox Code Playgroud)

这段代码是一个无意义的例子,但我的问题是,在这种情况下:

  1. 第一个 doSomething() 调用会被优化吗?
  2. 第二个 doSomething() 调用会被优化吗?
  3. if/else 块以任何方式影响优化?

谢谢

编辑:

请提供一个示例,说明如果语言不是 Java 而是其他具有 TCO 的语言,您将如何执行此操作

Mar*_*nik 5

Java 8 没有任何尾调用优化。不会优化任何调用(变成迭代/goto 语句)。

不过,关于 Java 的 TCO 的讨论由来已久,Guy Steele 是其最著名的支持者之一。

我建议从邮件列表中阅读这篇文章,以mlvm-dev获取对该主题的最新评论。