我正在尝试编写一个Java程序来计算大量的阶乘。似乎BigInteger无法容纳这么多的人。
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。还有其他方法可以处理吗?
StackOverflowError
这里的问题似乎是由于过多的递归导致堆栈溢出(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; }
希望这可以帮助!