首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java是否支持并优化了尾递归调用?

问java是否支持并优化了尾递归调用?
EN

Stack Overflow用户
提问于 2013-12-29 23:33:29
回答 2查看 7.2K关注 0票数 26

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

我刚刚读到Scala会检测到这类调用并对其进行优化,但这是Scala独有的还是一般意义上的JVM?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-29 23:43:02

Java支持尾递归调用,但是AFAIK并没有优化它们。我认为是Scala编译器能够做到这一点,而不是JVM本身。查看Scala中的@tailrec注释,了解编译器还能做些什么:)

但是,不管Java/JVM是否优化了尾递归,您的函数将比必要时更难优化。

看看这个:

代码语言:javascript
复制
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分支中循环时,您不再需要实际的堆栈框架-您在递归调用中获得了作为函数参数所需的所有内容。

在您的代码段中,堆栈帧可能必须与递归调用一样长。

票数 20
EN

Stack Overflow用户

发布于 2021-07-11 20:18:06

java中阶乘的尾递归,其空间复杂度为O(1)

代码语言:javascript
复制
  int tailFactorial(int x){
    return tailFactorial(x, 1);
}

int tailFactorial(int x, int totalFactor){
    if(x == 0){
        return totalFactor;
    }else{
        return tailFactorial(x-1, totalFactor * x);
    }

}
票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20826786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档