递归函数抛出java.lang.StackOverflowError

时间:2016-10-17 12:53:24

标签: java function recursion

当我尝试运行我的代码时,我收到错误java.lang.StackOverflowError:

public class calc {
    public static void main(String[] args){
double zahl = 847362;
System.out.println( wannawoerk(zahl) );

}


public static double wannawoerk(double zahl){
    if (zahl == 1)
        return 1;
    else
        return wannawoerk(zahl - 1) + zahl;
} }

此问题有解决方法吗?我不得不使用递归函数,而不是等等。

4 个答案:

答案 0 :(得分:8)

var input = "Premium UserId=5||Premium UserId>=2"; var regex = new RegExp( "(?:[0-9a-z\s])=(?![<>])", "gi" ); var output = input.replace( regex , function(match){ return match.charAt(0) + "==" } ); console.log(output); console.log("Premium UserId =5||Premium UserId>=2".replace( /(?:[0-9a-z\s])=(?![<>])/gi, function(match){ return match.charAt(0) + "==" } )); console.log("Premium UserId =>5||Premium UserId>=2".replace( /(?:[0-9a-z\s])=(?![<>])/gi, function(match){ return match.charAt(0) + "==" } )); 重复减1将最终得到1.(在此范围内整数的浮点减去整数 确切:你' d只会超过2)的53次幂。

您的问题是您的JVM可能不会允许您进行许多递归调用。

堆栈深度接近一百万,真的不会结束!

答案 1 :(得分:1)

堆栈不是无限制的,Java没有尾调用优化。最简单的解决方案是使用方法

return zahl * (zahl + 1) / 2;

理想情况下,你不会使用double而不是写

public static long sumUpTo(int n) {
    return n * (n + 1L) / 2;
}

要进行任何理智的优化,您需要一种更现实的方法。

答案 2 :(得分:0)

如果您需要使用递归,则可以增加堆栈的可用内存:java -Xss256m YourClass - 将堆栈设置为最大256MB。

在现实世界中,您最有可能使用while循环。或者,在这种情况下,立即计算它(你不需要递归你正在计算的东西),但我想这不是重点。

答案 3 :(得分:0)

你的这个例子也在this comment!中有说明,还有一些关于这个问题的非常详细的解释,为什么会发生以及如何处理它。