Reputation: 23
Could you guys please help me? I get the error :
Exception in thread "main" java.lang.StackOverflowError
at binarysearch.search(binarysearch.java:22)
at binarysearch.search(binarysearch.java:31)
(binarysearch.java:31 repeats like a dozen times). I have been trying to understand recursion but I guess I failed at somewhere.
public class binarysearch {
static int[] arr = new int[100];
public static void main(String[] args) {
// TODO Auto-generated method stub
fill();
if (search(31, arr, 1, 30)) {
System.out.println("true");
} else {
System.out.println("false");
}
}
public static void fill() {
for(int i = 1; i < 30; i++) {
arr[i] = i;
}
}
public static boolean search(int value, int[] data, int start, int end) {
int len = end - start + 1 ;
int mid = (start + end) / 2;
if (len == 1) {
return false;
} else {
if (data[mid] == value) {
return true;
} else {
if (data[mid] < value) {
return search(value, data, mid, end);
} else {
return search(value, data, start, mid);
}
}
}
}
}
Upvotes: 2
Views: 2141
Reputation: 1725
Try to change recursion calls to:
if (data[mid] < value) {
return search(value, data, mid+1, end);
} else {
return search(value, data, start, mid-1);
}
Upvotes: 1
Reputation: 1269
from search(31, arr, 1, 30)
You will run into
1, 30
15, 30
22, 30
26, 30
28, 30
29, 30
29, 30
29, 30
....
And become infinite stackOverFlow
So you algorithm should be
public static boolean search(int value, int[] data, int start, int end) {
int len = end - start + 1 ;
int mid = (start + end) / 2;
if (len == 1) {
return false;
} else {
if (data[mid] == value) {
return true;
} else {
if (data[mid] < value) {
return search(value, data, mid + 1, end);
} else {
return search(value, data, start, mid - 1);
}
}
}
}
Upvotes: 1