#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# author: bt3gl


def binary_search_recursive(array, item, higher=None, lower=0):

    higher = higher or len(array)
    if higher < lower:
        return False
    
    mid = (higher + lower)//2
    if  item == array[mid]:
        return mid
    elif item < array[mid]:
        return binary_search_recursive(array, item, higher=mid-1, lower=lower)
    else:
        return binary_search_recursive(array, item, higher=higher, lower=mid+1)


def binary_search_iterative(array, item):
    lower, higher = 0, len(array)

    while lower < higher:
        mid = (higher+lower)//2
        if array[mid] == item:
            return mid
        elif array[mid] > item:
            higher = mid
        else:
            lower=mid+1
    return False


def binary_search_matrix(matrix, item, lower=0, higher=None):
    """ Binary search in a matrix """

    if not matrix:
        return None
    
    rows = len(matrix)
    cols = len(matrix[0])
    higher = higher or rows*cols

    if higher > lower:
        mid = (higher + lower)//2
        row = mid//cols
        col = mid%cols
        item = matrix[row][col]

        if item == item:
            return row, col
        elif item < item:
            return binary_search_matrix(matrix, item, lower, mid-1)
        else:
            return binary_search_matrix(matrix, item, mid+1, higher)
        
    return None


if __name__ == '__main__':

    array = [2, 3, 5, 6, 8, 10, 15, 23]
    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    item = 15
    
    print('Recursive: ', binary_search_recursive(array, item))
    print('Iterative: ', binary_search_iterative(array, item))
    print('Matrix: ', binary_search_matrix(matrix, item))