我尝试了一个按位和程序之间的数字范围的a和b。 可以有'n'个测试用例。
0<=a,b<=2^32
1<=n<=200
递归调用中的StackOverFlow异常
说明:
1
2 4
计算:2&3&4
INPUT:
1
4009754624 4026531839
输出:
Exception in thread "main" java.lang.StackOverflowError at Example.BitwiseAnd.calculate(BitwiseAnd.java:78)
CODE:
public class BitwiseAnd
{
static long temp = 0;
static long result[];
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
int time = scan.nextInt();
if(validateTime(time))
{
result = new long[time];
for(int i=0;i<time;i++)
{
long arr[] = new long[2];
arr[0] = scan.nextLong();
temp=arr[0];
arr[1] = scan.nextLong();
if(validateNum(arr[0],arr[1]))
{
result[i] = calculateUsingRecursion(arr[0],arr[1]);
//result[i] = calculateUsingForLoop(arr[0],arr[1]);
}
else
{
System.out.println("Enter a valid numbers");
}
}
printResult(result);
}
else
{
System.out.println("Enter a valid number of testcases");
}
}
public static void printResult(long[] result)
{
for(int i=0;i<result.length;i++)
{
System.out.println(result[i]);
}
}
public static boolean validateNum(long num1, long num2)
{
Long max = (long)Math.pow(2, 32);
if(num1<0 || num1>max)
{
return false;
}
else if(num2<0 || num2>max)
{
return false;
}
return true;
}
public static boolean validateTime(int time)
{
if(time<1 || time>200)
{
return false;
}
return true;
}
private static long calculateUsingRecursion(long num1, long num2)
{
while(num1<num2)
{
num1=num1+1;
temp=temp&num1;
calculateUsingRecursion(num1, num2);
}
return temp;
}
private static long calculateUsingForLoop(long num1,long num2)
{
num1=num1+1;
for(long i=num1 ; i<=num2 ; i++)
{
temp=temp&num1;
}
return temp;
}
}
递归方法计算被扔我StackOverFlowException,对于大组数字。而为循环工作正常。 这里我的问题是为什么我们不能有大量输入的递归?以及如何用递归修复?
添加异常的堆栈跟踪将是有用的。 – araknoid
它适用于递归,但需要足够的内存来存储各个堆栈。你的情况你可以配置你的JVM为此提供更多的内存:https://stackoverflow.com/questions/3700459/how-to-increase-the-java-stack-size –
'“为什么我们不能有递归对于大量的输入“' - 因为调用栈是有限的。 – David