当我尝试运行我的代码时,我收到错误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;
} }
此问题有解决方法吗?我不得不使用递归函数,而不是等等。
答案 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!中有说明,还有一些关于这个问题的非常详细的解释,为什么会发生以及如何处理它。