线程" main"中的例外情况递归中的java.lang.StackOverflowError

时间:2016-06-12 12:06:38

标签: 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;
}
  

输入: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&lt; = 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); 
        } 
    } 
} 

此代码正在运行输入&lt; = 1024,建议编辑&gt; 1024 ...

1 个答案:

答案 0 :(得分:2)

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

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