java 中大数的阶乘

Factorial for big number in java

我一直在研究这个 recursive function 但找不到自己,这让我找到了 overflow error 并且它一直在出现。我也已经尝试转换为 BigInteger,但没有什么特别的。我在 Eclipse IDE 中没有看到任何警告或语法错误。我必须提交一个有效的大数算法。提前致谢。 :-)

public static BigInteger factorial(int n)
{
    return n > 2 ? new BigInteger(n+"").multiply(factorial(n-1)) : new BigInteger(n+"");
}

问题

您收到错误是因为计算机必须记住您进行的每个方法调用(以及其他信息),直到该方法调用完成,并且 [=32= 上只有这么多 space ] 放在一边记住所有这些。

您递归的次数太多以至于溢出堆栈 space 设置为记住正在进行的方法调用。这就是所谓的堆栈溢出。

可能的解决方案

一个相当有效的算法是使用一个简单的循环。这具有不会导致堆栈溢出的附带好处,因为您不会一遍又一遍地创建更多方法调用,您只需在第一个方法调用中执行操作。

您还应该使用 BigInteger.valueOf(n) 而不是 new BigInteger(n+""):

public static BigInteger factorial(int n) {
    BigInteger result = BigInteger.ONE;
    for (; n > 1; n--) {
        result = result.multiply(BigInteger.valueOf(n));
    }
    return result;
}

这需要我的计算机大约 6 秒来计算 100,000!

更高效的解决方案

还有比这更快的算法。有关详细信息,请参阅 another question 及其链接。