我嘗試了一個按位和程序之間的數字範圍的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