一尘不染

BigInteger的StackOverflowError计算阶乘?

algorithm

我正在尝试编写一个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。还有其他方法可以处理吗?


阅读 278

收藏
2020-07-28

共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;
}

希望这可以帮助!

2020-07-28