算法图解中的代码问题


def binary_search(list, item):
    low = 0
    high = len(list) - 1
    while low <= high:
        mid = (low + high)/2
        guess = list[mid]
        if guess == item:
            return mid
        elif guess > item:
            high = mid - 1
        else:
            low = mid + 1
    return

list1 = [1,2,3,5,7]
binary_search(list1, 2)

代码如图,目的是使用二分法查找出元素的位置,但实际上第二次函数返回的值是一个小数而无法运行,有没有什么解决办法呢?

应该分情况讨论,当函数返回的值是一个小数时,应选择小数左右两个数作为mid。list是python关键字,形参最好不要用


#添加math模块
import math
def binary_search(li, item):
    #列表排序
    li.sort()
    
    low = 0
    high = len(li) - 1
    #如果item小于列表最小值,或大于最大值,返回错误,
    #如果item=最小值或最大值,返回最小值或最大值对应的下标
    if item < li[low] or item> li[high]:
        return '错误'
    elif item ==li[low]:
        return low
    elif item ==li[high]:
        return high

    
    while  high - low>1:
        #如果mid的类型为int,mid为列表中位数序号
        if type((low + high)/2)==int:
            mid = (low + high)/2
            guess = li[mid]
            if guess == item:
                return mid
            elif guess > item:
                high = mid 
            else:
                low = mid
        #如果mid为小数,需要找列表中间的两个值
        else:
            #math.floor(i)向下取整,math.ceil(i)向上取整
            mid=[math.floor((low + high)/2),math.ceil((low + high)/2)]
            if li[mid[0]] == item:
                return mid[0]
            elif li[mid[1]] == item:
                return mid[1]
            elif li[mid[0]]<item<li[mid[1]]:
                return [li[mid[0]],li[mid[1]]]
            elif item<li[mid[0]]:
                high = mid[0]
            else:
                low = mid[1]
    #返回的是一个下标范围
    return [low,high]
 
list1 = [1,2,3,5,7]
binary_search(list1, 2)



你可以使用整数除法,直接除默认是小数除法。整数除法用//表示,也可以先默认除,然后将结果强制转换为整数