def binary_search(lst, pattern, offset=0):
    """
    二分查找
    :param lst: 待查找序列（切片）
    :param pattern: 查找元素
    :param offset: 切片下标偏移量（即从列表的offset元素开始查找匹配）
    :return:
    """
    if not lst:
        return -1

    middle = len(lst) // 2
    if pattern == lst[middle]:
        return offset + middle
    elif pattern > lst[middle]:
        # 待查找元素大于序列中间值，递归待右侧序列查找
        return binary_search(lst[middle + 1:], pattern, offset=offset+middle+1)
    else:
        return binary_search(lst[:middle], pattern, offset=offset)