【发布时间】:2012-01-24 18:57:55
【问题描述】:
我正在尝试编写一个 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。有没有其他办法处理?
【问题讨论】:
-
对于 BigInteger 数据类型来说,这不可能是最大的。 stackoverflow 异常在哪里被抛出?发布更多相关代码。
-
是的,使用迭代算法。 BigInteger 做得很好,getFactorial 只是吃掉了所有的堆栈空间。
-
@harold (+1) - 另一个我认为递归对教授大学生有害的技术的例子,至少在没有尾递归的语言中是这样。这是一项智力练习,但最终对任何有趣的事情都没有用。
-
递归“对任何有趣的事情都没有用”?嗯。
-
@JonH:堆栈溢出与数值溢出不同,
num的类型在这里无关。
标签: java algorithm stack-overflow biginteger factorial