java - Java 是否支持和优化尾递归调用?

标签 java scala optimization recursion jvm

假设我有一个尾递归的递归函数。我想知道这个函数是否会被实现为递归,在堆栈上增长,或者它会被更改为循环(因为它是一个尾递归函数)?

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

最佳答案

Java 支持尾递归调用,但据我所知,它并没有优化它们。我认为是 Scala 编译器能够做到这一点,而不是 JVM 本身。查看 Scala 中的 @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,其中包含到目前为止已计算的总和参数。这样,当您在 else 分支中重复出现时,您不再需要实际的堆栈帧 - 您在递归调用中获得了所有需要的函数参数。

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

关于java - Java 是否支持和优化尾递归调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20826786/

相关文章:

c++ - 在C/C++结构中添加UNUSED元素会加快并减慢代码执行速度

java - 程序打开所有应用程序

java - 从 dbpedia 检索数据时出错

java - 当焦点状态改变时如何改变 "drawableLeft"?

java - 如何在 Base 适配器中停止文本到语音

ScalaFX:如何将图像对象转换为字节数组

scala - 使 SBT 子项目中的编译操作依赖于其他子项目的编译而不将它们添加到类路径

c - 在 __m128 上右移 32 位的最快方法(Intel Intrinsics)

scala - 模拟 Scala 对象

r - R : efficiently count number of edges between multiple sets of vertices 中的 igraph