5

我得到了StackOverflowException这个 Java 方法:

private static final Integer[] populate(final Integer[] array, final int length, final int current) {

    if (current == length) {
        return array;
    } else {
        array[current] = TR.random.nextInt();
        System.out.println(array[current]);
        return populate(array, length, current + 1);
    }
}

我正在玩尾调用递归,所以我想这就是当 JVM 不短路堆栈时会发生的情况,对吧?

4

4 回答 4

7

据我所知,没有 JVM 支持尾调用优化。这不是疏忽。显然,这种优化对 Java 反射和 Java 安全管理器具有重大影响。

参考:

于 2010-12-13T13:50:57.937 回答
3

是的,由于安全模型和需要始终有可用的堆栈跟踪,JVM 目前不支持尾调用优化,但是可以使用迭代轻松重写此示例。

于 2010-12-13T13:54:26.587 回答
1

我在java中找到了尾递归的参考,因此我会检查这个,(稍后我有时间)。

尽管这对您的用例来说效率极低。

于 2010-12-13T13:43:49.363 回答
1

纯Java没有尾调用优化,AFAIK。Scala 确实有一些有限的实现:http: //fupeg.blogspot.com/2009/04/tail-recursion-in-scala.html

于 2010-12-13T13:57:20.630 回答