Java中的尾递归优化和递归
Tail recursion optimization and recursion in Java
我有一个关于尾调用优化的问题,我需要知道这段 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
的其他语言,您将如何执行此操作
Java 8 没有任何尾调用优化。不会优化任何调用(变成 iteration/goto 语句)。
不过,关于 Java TCO 的讨论由来已久,Guy Steele 是其最著名的支持者之一。
我建议阅读 mlvm-dev
邮件列表中的 this post 以获得对该主题的最新评论。
尝试运行使用以下代码:
public static void main(String[] args) {
for (int i = 1; i > 0; i *= 2) { doSomething(i); }
}
private static void doSomething(int start) {
doSomething(start, start);
}
private static void doSomething(int i, int start) {
if (i == 0) { System.out.println("done from " + start); }
else { doSomething(i - 1, start); }
}
如果 JVM 可以 运行 它没有堆栈溢出,那么它应该意味着它可以进行尾递归优化(或非常好的常量传播)。
我有一个关于尾调用优化的问题,我需要知道这段 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
的其他语言,您将如何执行此操作Java 8 没有任何尾调用优化。不会优化任何调用(变成 iteration/goto 语句)。
不过,关于 Java TCO 的讨论由来已久,Guy Steele 是其最著名的支持者之一。
我建议阅读 mlvm-dev
邮件列表中的 this post 以获得对该主题的最新评论。
尝试运行使用以下代码:
public static void main(String[] args) {
for (int i = 1; i > 0; i *= 2) { doSomething(i); }
}
private static void doSomething(int start) {
doSomething(start, start);
}
private static void doSomething(int i, int start) {
if (i == 0) { System.out.println("done from " + start); }
else { doSomething(i - 1, start); }
}
如果 JVM 可以 运行 它没有堆栈溢出,那么它应该意味着它可以进行尾递归优化(或非常好的常量传播)。