Java 带递归的堆栈溢出错误
有人能告诉我为什么我会犯这个错误吗?这真让我心烦。我想做的是找到表达式2^k+1的和,因为k的范围从1到nJava 带递归的堆栈溢出错误,java,exception,recursion,compiler-errors,stack-overflow,Java,Exception,Recursion,Compiler Errors,Stack Overflow,有人能告诉我为什么我会犯这个错误吗?这真让我心烦。我想做的是找到表达式2^k+1的和,因为k的范围从1到n import java.util.*; public class mySums { private static double n; public static void main(String[] args) { recurSum(4); System.out.println(); } /* public static void iterativeSum (int
import java.util.*;
public class mySums
{
private static double n;
public static void main(String[] args)
{
recurSum(4);
System.out.println();
}
/* public static void iterativeSum (int num)
{
}
*/
public static double recurSum (double num)
{
if (n==1){
return 1;}
else {
return (Math.pow(2.0, n) +1) + recurSum(n-1);}
}
}
谢谢。这是因为您在
递归中使用的是n
而不是num
n
是一个永远不变的静态变量;你应该移除它<另一方面,code>num
是传递给recurSum
的参数;它的值随着递归调用级别的降低而降低,最终达到1
并允许您退出:
public static double recurSum (double num) {
if (num==1) {
return 1;
} else {
return (Math.pow(2.0, num) +1) + recurSum(num-1);
}
}
由于精度问题,请不要将“==”与double一起使用,这样您的递归就永远不会结束
换成
if (n <= 1)
if(n)使用递归(n-1)
,但是recurSum
传递的是变量num
,而不是n
。我不认为这是你想要做的,是吗?提示:n是静态的,它的值不会改变,因此你的递归是无限的。使用非静态的=
操作符是一个很好的建议,但不是问题的中心。啊,是的,刚刚注意到n I是静态的。这就是原因吗?我想如果是这样的话,它甚至不应该编译,不是吗?啊,nvm刚刚注意到n是静态的。@Kiwi为什么不呢?n
是一个合法的static
变量,所有静态方法都可以访问它,所以编译器很高兴地将它编译成某种保证堆栈溢出的东西。