Java中的尾部递归编程

Java中的尾部递归编程,java,c++,performance,algorithm,recursion,Java,C++,Performance,Algorithm,Recursion,我已经用C/C++编写代码好几年了,最近才开始使用Java。在我做过的一个项目中,我在一个大数据集上做尾部递归(很抱歉没有提供代码,因为我找不到它…)。与C/C++相比,我意识到了一个明显的性能问题。然后,我读了几篇关于为什么JVM不支持尾部调用优化(还?)的文章,以及Java程序员通常(如果不总是)使用循环来代替尾部递归调用的文章 因此,在Java中,尾部递归编程在语义上是错误的,还是不管使用哪种语言,它只是一种不好的做法 以下两个Java函数在性能方面和语义方面是否有区别 非递归的 int

我已经用C/C++编写代码好几年了,最近才开始使用Java。在我做过的一个项目中,我在一个大数据集上做尾部递归(很抱歉没有提供代码,因为我找不到它…)。与C/C++相比,我意识到了一个明显的性能问题。然后,我读了几篇关于为什么JVM不支持尾部调用优化(还?)的文章,以及Java程序员通常(如果不总是)使用循环来代替尾部递归调用的文章

因此,在Java中,尾部递归编程在语义上是错误的,还是不管使用哪种语言,它只是一种不好的做法

以下两个Java函数在性能方面和语义方面是否有区别

非递归的

int factorial(int n)
{
    int result = 1;
    for (int i=1; i<=n; i++) 
        result *= i;

    return result;
}
int factorial(int n)
{
    if (n == 1)
        return 1;

    return factorial(n-1) * n;
}
另外,将递归版本更改为以下版本是否有任何区别

int factorial(int n)
{
    if (n == 1)
        return 1;

    //below is changed
    int result = factorial(n-1) * n;
    return result;
}

Java中的尾部递归编程并不是完全错误的,它只是效率低下,并且很容易导致堆栈溢出


<>爪哇中,由于尾递归优化不能保证(如注释中所指出的),在C++中,不保证在JavaScript、C++ C++等方面的通用性。因此依赖它是不可移植的。对于一些编程语言,如Prolog和Haskell,递归是执行迭代的唯一方法。显然,在这种情况下,尾部递归是实现的,因为否则很容易耗尽调用堆栈。我明白了,所以即使对于c,循环也是执行递归迭代的更好选择?@ThomasHsieh这是一个算法最适合的问题;递归调用的开销很少有意义。举例来说,我写一个带循环的阶乘函数是很不自然的。这正是促使我关注这个问题的原因。谢谢