我有一个关于尾调用优化的问题,我需要知道这个java代码是如何运行的:
private void doSomething(int v) {
inf f = someCalculation(v);
if (f < 0) doSomething(v/2);
else doSomething(v*2);
}这个代码是一个毫无意义的例子,但我的问题是,在这种情况下:
谢谢
编辑:
请提供一个示例,说明如果语言不是Java,而是具有TCO的其他语言,您将如何做到这一点
发布于 2015-02-23 09:46:31
Java 8没有任何尾部调用优化。没有调用将被优化(转化为迭代/goto语句)。
然而,关于TCO for Java的讨论有着悠久的历史,Guy Steele是其最著名的支持者之一。
我建议从这个职位邮件列表中阅读mlvm-dev,以了解该主题的最新进展。
发布于 2015-02-23 10:13:34
尝试运行以下代码:
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可以在没有堆栈溢出的情况下运行它,那么它应该意味着它可以进行尾递归优化(或者非常好的常量传播)。
https://stackoverflow.com/questions/28670760
复制相似问题