Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中大数的阶乘_Java_Biginteger_Factorial - Fatal编程技术网

java中大数的阶乘

java中大数的阶乘,java,biginteger,factorial,Java,Biginteger,Factorial,我一直在使用这个递归函数,但找不到自己,这导致我出现了溢出错误,并且它不断出现。我也尝试过使用biginger,但没有什么特别的效果。我在我的eclipseide中没有看到任何警告或语法错误。我必须提交一个有效的大数字算法。提前感谢。:-) 问题 您之所以会出现错误,是因为计算机必须记住您所做的每个方法调用(以及其他信息),直到该方法调用完成,而“堆栈”上只留出这么多空间来记住所有这些 递归次数太多,以至于为记住正在进行的方法调用而设置的堆栈空间溢出。这称为堆栈溢出 可能的解决办法 一个合理有效

我一直在使用这个
递归函数
,但找不到自己,这导致我出现了
溢出错误
,并且它不断出现。我也尝试过使用
biginger
,但没有什么特别的效果。我在我的
eclipseide
中没有看到任何警告或语法错误。我必须提交一个有效的大数字算法。提前感谢。:-)

问题 您之所以会出现错误,是因为计算机必须记住您所做的每个方法调用(以及其他信息),直到该方法调用完成,而“堆栈”上只留出这么多空间来记住所有这些

递归次数太多,以至于为记住正在进行的方法调用而设置的堆栈空间溢出。这称为堆栈溢出

可能的解决办法 一个合理有效的算法是使用一个简单的循环。这样做的另一个好处是不会导致堆栈溢出,因为您不会一次又一次地创建更多的方法调用,只需在第一个方法调用中进行操作

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

这需要我的计算机大约6秒来计算100000

更有效的解决方案
还有比这更快的算法。有关更多详细信息,请参阅及其链接。

@SarthakSrivastava是的,似乎是这样。对我来说唯一的一个限制是我不能修改递归签名,在本例中是
int n
。StackOverflower错误意味着您有太多的函数调用,无法将它们的数据放在堆栈上。通常这表明你有无限的recursions@SarthakSrivastava,
返回n>2?新的BigInteger(n+)。乘法(阶乘(--n)):新的BigInteger(n+)我只是这样修改过,它仍然是
stackoverflowererror
。解决stackoverflower错误您的代码看起来很好。当您遇到溢出错误时,原始的
n
是什么?感谢您的解释和关注。它比我写的更有效率。不过,我还是得找一个效率更高的。我的教练太严格了(无论如何,兄弟,谢谢你。我期待着你描述的链接。:-)
public static BigInteger factorial(int n)
{
    return n > 2 ? new BigInteger(n+"").multiply(factorial(n-1)) : 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;
}