Reputation: 105
When I run the below program I am getting the following errors: (any ideas?)
Exception in thread "main" java.lang.StackOverflowError
at SumArray.binarySum(SumArray.java:31)
at SumArray.binarySum(SumArray.java:34)
Here is the code: I need to generate an array of random integers and use binary and linear recursion to add the values thereof...
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);
}
}
Upvotes: 0
Views: 381
Reputation: 356
You're recursively calling your BinarySum method with it's third parameter as ceil/2, and floor/2 which will never change. ceil/2 is 0 and floor/2 is 50000, neither of these is 1, so you're getting infinite recursion. Seems like you probably want those values to be different for each recursive call...
My Java is a little rusty (maybe somebody more used to coding in Java can clean this up), but as an example, try something like this:
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));
}
}
For each call we split what we're searching into two halves and recurse, until we get down to a single item.
Upvotes: 2
Reputation: 66273
binarySum
gets an parameter n
which is not used inside the function. Therefore your recursion does not split the work into two parts and therefore never ends.
Also: You are mixing array indices (n
, i
) with the contents of the array (ceil
, floor
). This is also quite simply wrong.
Hint: Insert a System.out.println
at the start of binarySum
which prints out all relevant variables. You will quickly see what's wrong.
Upvotes: 0
Reputation: 15675
In binary sum, if n==0, you will continue to recurse infinitely, and eventually run out of stack space. Try fixing that, see if it helps. Good luck!
Upvotes: 1