我一直在努力解决这个问题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+"");
}
答案 0 :(得分:1)
您收到错误是因为计算机必须记住您所做的每个方法调用(以及其他信息),直到该方法调用完成,并且“堆栈”上只有这么多空间留出来记住所有这些。
你进行了多次递归,以便溢出设置的堆栈空间以记住正在进行的方法调用。这称为堆栈溢出。
合理有效的算法是使用简单的循环。这样做的另一个好处就是不会导致堆栈溢出,因为你不会反复创建更多的方法调用,只需在第一个方法调用中执行操作。
您还应该使用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及其链接。