![](/img/trans.png)
[英]Java - Recursion - Exception in thread “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.