public final class RecursiveBinary { public static int search (final int v, final int[] data) { return search (v, data, 0, data.length); } public static int search (final int v, final int[] data, final int last) { return search (v, data, 0, last); } // Search everything from 'first' to 'last-1' (inclusive) public static int search (final int v, final int[] data, final int first, final int last) { assert 0<=first && first<=data.length; assert 0<=last && last<=data.length; final int low = first, high = last-1; final int mid = (low+high) >>> 1; // works even when + overflows if (first >= last) { return -1; // v not found } else if (data[mid] == v) { return mid; // v found } else if (data[mid] < v) { System.out.printf ("data[%d]=%d is too low%n", mid, data[mid]); // Everything from 'low' to 'mid' is excluded. assert first < mid+1; return search (v, data, mid+1, last); } else { assert data[mid] > v; System.out.printf ("data[%d]=%d is too high%n", mid, data[mid]); // Everything from 'mid' to 'high' is excluded. assert mid < last; return search (v, data, first, mid); } } public static void main (final String [] args) { final int [] data = new int [args.length-1]; final int v = Integer.parseInt (args[0]); int n = 0; for (int i=1; i