繁体   English   中英

递归中线程“ main”中的异常java.lang.StackOverflowError

[英]Exception in thread “main” java.lang.StackOverflowError in recursion

这是计算阶乘的函数事实

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;
}

输入:1 88888

 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 

这段代码如何在te <= 1000000000上运行?

这是我的主要功能:

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); 
        } 
    } 
} 

此代码针对输入<= 1024运行,建议编辑> 1024 ...

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

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM