“线程中的异常”;“主要”;递归中的java.lang.StackOverflower错误

“线程中的异常”;“主要”;递归中的java.lang.StackOverflower错误,java,function,exception,recursion,biginteger,Java,Function,Exception,Recursion,Biginteger,这里是计算阶乘的函数事实 static BigInteger fact(BigInteger n) { BigInteger f=BigInteger.ONE; BigInteger temp; if(n.compareTo(BigInteger.ONE) <= 0) return f; f=f.multiply(n).multiply(fact(n.subtract(BigInteger.ONE))); return f; } 这

这里是计算阶乘的函数事实

static BigInteger fact(BigInteger n)
{
    BigInteger f=BigInteger.ONE;
    BigInteger temp;
    if(n.compareTo(BigInteger.ONE) <= 0)
        return f;
    f=f.multiply(n).multiply(fact(n.subtract(BigInteger.ONE)));
    return f;
}

这段代码如何为te运行问题是,您有一个最大的递归深度。如果您想避免这种情况,可以重写代码而无需递归。这可以使用一个简单的循环来完成。它看起来像这样(此代码完全未经测试):


问题是,你有一个最大的递归深度。如果您想避免这种情况,可以重写代码而无需递归。这可以使用一个简单的循环来完成。它看起来像这样(此代码完全未经测试):


检查此>>检查此>>无法完全测试,因为
n
引用了一个不可变的
biginger
对象,所以
n.subtract()
不做任何事情;除非你给某物赋值。你的意思是“完全未经测试”?对于输入大于10000的任何其他优化解决方案,都需要花费大量时间。我看不到任何直接和简单的方法来优化这段代码(但我自己不是一个大的优化器)。计算一个数的阶乘有很多不同的方法。也许这可以帮助你们。实际上问题不仅仅是计算阶乘,实际问题是计算阶乘中零作为后缀的数量@Leon同样,如果这个答案帮助或解决了你的
StackOverflower问题(看起来是这样的),请接受它。不能完全测试,因为
n
引用了一个不可变的
BigInteger
对象,所以
n.subtract()
什么都不做;除非你给某物赋值。你的意思是“完全未经测试”?对于输入大于10000的任何其他优化解决方案,都需要花费大量时间。我看不到任何直接和简单的方法来优化这段代码(但我自己不是一个大的优化器)。计算一个数的阶乘有很多不同的方法。也许这可以帮助你们。实际上问题不仅仅是计算阶乘,实际问题是计算阶乘中零作为后缀的数量@Leon同样,如果这个答案帮助或解决了您的
StackOverflowerError
问题(看起来是这样的),请接受它。
Output:
Exception in thread "main" java.lang.StackOverflowError
  at java.math.BigInteger.multiplyByInt(BigInteger.java:1523)
  at java.math.BigInteger.multiply(BigInteger.java:1490)
  at codechef.fact(codechef.java:30)
  at codechef.fact(codechef.java:30)..... about 100 times
class codechef 
{ 
    public static void main(String[] args) 
    { 
        Scanner sc = new Scanner(System.in); 
        int t=sc.nextInt(); 
        for(int i=0;i<t;i++)
        { 
            int count=0; String te=sc.next();
            BigInteger n=new BigInteger(te); 
            te=fact(n).toString(); 
            for(int j=te.length()-1;j>=0;j--)
            { 
                if(te.charAt(j) == '0')
                { count++; } 
                else break; 
            } 
            System.out.println(count); 
        } 
    } 
} 
static BigInteger fact(BigInteger n){
    BigInteger f = BigInteger.ONE;
    while(n.compareTo(BigInteger.ONE) > 0) {
        f = f.multiply(n);
        n = n.subtract(BigInteger.ONE);
    }
    return f;
}