StackOverflowErr计算一个大Integer的阶乘?

我正在尝试编写一个Java程序来计算大数的阶乘。似乎无法容纳这么大的数字。BigInteger

以下是我写的(简单)代码。

 public static BigInteger getFactorial(BigInteger num) {
      if (num.intValue() == 0) return BigInteger.valueOf(1);

      if (num.intValue() == 1) return BigInteger.valueOf(1);

      return num.multiply(getFactorial(num.subtract(BigInteger.valueOf(1))));
  }

上述程序在 5022 中处理的最大数量,之后程序将抛出一个 .有没有其他方法来处理它?StackOverflowError


答案 1

这里的问题看起来像是过多递归导致的堆栈溢出(5000 个递归调用看起来像是吹出 Java 调用堆栈的正确数量的调用),而不是 的限制。迭代重写阶乘函数应该可以解决此问题。例如:BigInteger

public static BigInteger factorial(BigInteger n) {
    BigInteger result = BigInteger.ONE;

    while (!n.equals(BigInteger.ZERO)) {
        result = result.multiply(n);
        n = n.subtract(BigInteger.ONE);
    }

    return result;
}

希望这有帮助!


答案 2

问题不在于 BigInteger,而在于您使用递归方法调用 ()。getFactorial()