Java是否支持并优化尾部递归调用?

用户3073853:

说我有一个尾递归的递归函数。

System.out.println( sum(Arrays.asList(0, 1, 2, 3, 4, 5)) );

int sum(List<Integer> integers) {
    if (integers.isEmpty())
        return 0;
    else
        return integers.get(0) + sum(integers.subList(1, integers.size()));
}

我想知道这个函数是sum在堆栈上增长还是会变成循环(因为它是一个尾递归函数)?

我刚刚读到Scala可以检测到此类调用并对其进行优化,但这通常是Scala专用的东西还是JVM?

emesx:

Java支持尾递归调用,但AFAIK并没有优化它们。我认为只是Scala编译器能够做到这一点,而不是JVM本身。退房@tailrec斯卡拉注释,看看有什么更多的编译器能够:)

但是,无论Java / JVM是否优化了尾部递归,您的函数都将比必要的优化难度更大。

看这个:

int sum(List<Integer> integers) {
    return sum(integers, 0);
}

int sum(List<Integer> integers, int sumSoFar) {
    if (integers.isEmpty())
        return sumSoFar;
    else
        return sum(
                integers.subList(1, integers.size()),
                sumSoFar + integers.get(0)
        );
}

瞧,我已经添加了一个重载sum函数,它具有一个到目前为止计算出的sum参数。这样,当您在else分支中递归时,您不再需要实际的堆栈框架-您在递归调用中获得了所有需要的函数参数。

在您的代码段中,只要递归调用,堆栈框架可能就必须存在。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Go递归函数调用是否优化了尾部?

尾部调用优化是否适用于除递归调用以外的其他调用?

Java 8是否具有尾部调用优化功能?

Swift是否实现尾部调用优化?在相互递归的情况下?

JVM是否阻止尾部调用优化?

为什么没有JavaScript引擎支持尾部调用优化?

JavaScript尾部调用中的函数是否已优化?

尾部调用优化是否适用于此功能?

是否对JavaScript引擎尾部调用(TCO)进行了优化?

Java是否支持尾递归?

我在此代码上收到StackOverFlowException,因为我的JVM不支持尾部调用优化,对吗?

C#编译与尾部递归优化?

F#是否使用|> Option.bind执行TCO(尾部调用优化)

Node.js:异步函数中是否对尾部调用进行了优化?

ML系列编译器是否对尾部调用进行了任何复杂的优化?

(前向)管道运算符可以/是否可以阻止尾部调用优化?

Javascript引擎中的尾部调用优化实现

尾调用递归“优化”

编译器是否可以优化递归调用?

NVCC 和 NVRTC 是否支持尾调用优化?

绑定函数是否支持ES6中适当的尾部调用?

像Babel这样的编译器如何在固有地不受支持的情况下实现尾部调用优化?

递归调用不在尾部位置

可以以尾部优化的方式重写此特定的递归吗?

使用Java 8设计尾部递归

Java中的尾部/前向递归

尾部递归的java.lang.OutOfMemoryError

Java递归算法的优化

共享指针会破坏尾部调用优化吗?