在二进制搜索中,为什么我的循环是无限的?

时间:2018-12-18 20:25:29

标签: python-3.x algorithm binary-search

我运行带有函数的while循环,以检查变量i是否高于列表的len。我将其放置在此处作为停止循环的一种方法,但它不会对其进行检查。由于它本身并没有结束,所以我必须在其中放置一个if条件,该条件返回false。

def binarySearch(numberlist, number):
    first = 0
    last = len(numberlist)-1
    found = False
    i=0

    while found == False or i <= len(numberlist):
        i = i + 1
        mid = (first + last) // 2
        print(numberlist[mid])
        if i > len(numberlist)+1:
            return False
        if mid < first or mid > last or mid < 0:
            return False
        if number == numberlist[mid] or number == numberlist[first] or number == numberlist[last] :
            return True
        elif number < numberlist[mid]:
            last = mid
        elif number > numberlist[mid]:
            first = mid
    return False

1 个答案:

答案 0 :(得分:1)

错误在于以下几行。

elif number < numberlist[mid]:
    last = mid
elif number > numberlist[mid]:
    first = mid

考虑以下情况:我们正在寻找不在列表中的编号

指针firstlastmid最终将全部收敛到某个索引。在那种情况下,最后两个条件之一将是True,但是由于所有三个值已经相等,因此指针不再更新,并且我们进入无限循环。

为确保不会发生这种情况,我们必须通过将first设置为mid + 1或将last设置为{{ 1}},具体取决于条件。如果mid - 1大于first,我们就可以停止循环。

last