/// Returns the index of target in a sorted array, or -1 if it is absent.
int binarySearch(int[] items, int target) {
    return binarySearch(items, target, 0, items.length - 1);
}

/// Searches items from index low to index high, both included.
int binarySearch(int[] items, int target, int low, int high) {
    if (low > high) {
        return -1;
    }

    int middle = (low + high) / 2;

    if (items[middle] == target) {
        return middle;
    } else if (items[middle] < target) {
        return binarySearch(items, target, middle + 1, high);
    } else {
        return binarySearch(items, target, low, middle - 1);
    }
}

void main() {
    int[] numbers = {4, 8, 9, 15, 17, 23, 42};
    IO.println(binarySearch(numbers, 23));
    IO.println(binarySearch(numbers, 5));
}

// From Groundwork, chapter 12 (ch12-recursion-and-problem-solving), box 10.
// This example is from Groundwork, licensed CC BY-NC-SA 4.0.
// Run with: java ch12_10.java
