def find_number(n, list_of_numbers):
    """Returns index of found number via binary search or None

    Parameters
    ----------
    n : `int` or `float` or `Fraction`
        The number we seek.
    list_of_numbers: `list`
        Sorted list of numbers.

    Returns
    -------
    `int` or None
        The index of n in list_of_numbers if found,
        None otherwise.
    """

    def print_num(j):
        # Utility function to display search progress
        if j is not None:
            print(f"-> {list_of_numbers[j]}", end=' ')
        else:
            print("-> None", end=' ')

    def binary_find(start, end, count):
        # Recursive binary search
        # start and end are list indices, count is the
        # number of times this function is called.

        count += 1

        # Handle the case when the list has one item.
        if start + 1 == end:
            if n == list_of_numbers[start]:
                print_num(start)
                return (start, count)

            print_num(None)
            return (None, count)

        # Find the index of the item in the middle of the list.
        mid_point = (start + end) // 2

        # Have we succeeded?
        if n == list_of_numbers[mid_point]:
            print_num(mid_point)
            return (mid_point, count)

        print_num(mid_point)

        # Should we check the second half of the list?
        if n > list_of_numbers[mid_point]:
            return binary_find(mid_point + 1, end, count)

        # Check the first half of the list.
        return binary_find(start, mid_point, count)

    # Begin the search on the entire list.
    return binary_find(0, len(list_of_numbers), 0)