Java 带递归的堆栈溢出错误

Java 带递归的堆栈溢出错误,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

有人能告诉我为什么我会犯这个错误吗?这真让我心烦。我想做的是找到表达式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 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
变量,所有静态方法都可以访问它,所以编译器很高兴地将它编译成某种保证堆栈溢出的东西。