当我运行以下程序时,我收到以下错误:(任何想法?)
Exception in thread "main" java.lang.StackOverflowError
at SumArray.binarySum(SumArray.java:31)
at SumArray.binarySum(SumArray.java:34)
这是代码:我需要生成一个随机整数数组,并使用二进制和线性递归来添加其值......
import java.io.*;
import java.util.ArrayList;
import java.util.Random;
class SumArray {
static int floor = 100000;
static int ceil = 0;
int result;
int half;
int half2;
//Linear Recursion
int sum(int a[], int n) {
if (n == 1)
return a[0];
else {
result = sum(a, n - 1);
result = result + a[n - 1];
return result;
}
}
//Binary Recursion
int binarySum(int a[], int i, int n) {
if (n == 1)
return a[0];
return binarySum(a, i, ceil/2) + binarySum(a, i + ceil/2, floor/2);
}
public static void main(String args[]) throws IOException {
//Define ArrayList to hold Integer objects
ArrayList<Integer> numbers = new ArrayList<Integer>();
// User determines number of elements
DataInputStream dis = new DataInputStream(System.in);
System.out.println("Hello! Please enter the size of your array: ");
int n = Integer.parseInt(dis.readLine());
// Generate specified number of random integers
Random randNumGenerator = new Random();
int[] x = new int[n];
// While still less than indicated number.. add more
for (int i = 0; i < x.length; i++) {
x[i] = (randNumGenerator.nextInt(100000));
numbers.add(x[i]);
//calculate min and max values
if(ceil < x[i]) {
ceil = x[i];
}
if(floor > x[i]) {
floor = x[i];
}
}
SumArray a1 = new SumArray();
// Print array values
System.out.println("Array values inlude: " + numbers);
// Print the sum
System.out.println("The sum of the array using Linear Recursion is: " + a1.sum(x, n));
// Print the binary sum
System.out.println("The sum of the array using Binary Recursion is: " + a1.binarySum(x, n, n));
System.out.println("Ceiling: " + ceil);
System.out.println("Floor: " + floor);
}
}
答案 0 :(得分:2)
你递归调用你的BinarySum方法,它的第三个参数为ceil / 2,而floor / 2则永远不会改变。 ceil / 2为0,floor / 2为50000,这些都不是1,所以你得到无限递归。看起来你可能希望每个递归调用的值都不同......
我的Java有点生疏(也许更习惯用Java编码的人可以清理它),但作为一个例子,尝试这样的事情:
class Accumulator {
static int binarySum(int a[]) {
return binarySum(a, 0, a.length-1);
}
static int binarySum(int a[], int s, int e) {
if (e-s == 0) return a[s];
int mid = s + ((e-s)/2);
return binarySum(a, s, mid) + binarySum(a, mid+1, e);
}
public static void main(String args[]) {
int[] vals = {2,3,4,5,6,7};
System.out.println(binarySum(vals));
}
}
对于每次通话,我们将我们正在搜索的内容分成两半并递归,直到我们找到一个项目。
答案 1 :(得分:1)
在二进制和中,如果n == 0,您将继续无限递归,并最终耗尽堆栈空间。尝试修复它,看它是否有帮助。祝你好运!
答案 2 :(得分:0)
binarySum
获取参数n
,该参数未在函数内使用。因此,您的递归不会将工作分成两部分,因此永远不会结束。
另外:您正在将数组索引(n
,i
)与数组的内容混合(ceil
,floor
)。这也是完全错误的。
提示:在System.out.println
的开头插入binarySum
,打印出所有相关变量。你很快就会发现什么是错的。