python中二进制搜索算法的意外行为

时间:2015-06-13 02:32:51

标签: python binary-search

我是python的新手。在尝试制作二进制搜索功能时,我面临着意想不到的问题。我不明白为什么会这样。我试图修改代码,但结果每次都是一样的。这是代码:

def bsearch(s,e,first,last,calls):
    print(first,last,calls)
    if((first-last)<2):
        return (s[first]==e or s[last]==e)
    mid = first + int((last-first)/2)
    if (s[mid]==e):
        return True
    if (s[mid]>e):
        return bsearch(s,e,first,mid-1,calls+1)
    else:
        return bsearch(s,e,mid+1,last,calls+1)

def search(s,e):
    bsearch(s,e,0,len(s)-1,1)

这是我在shell中键入并获取输出:

>>> s=[1,2,3,4,5,6,7,8,9,10,11,12,13,15,16]
>>> search(s,5)

输出:

0 14 1

多数民众赞成。它不会搜索列表中的元素。

2 个答案:

答案 0 :(得分:1)

错误就在这里:

if((first-last)<2): #This always will be less than 2

应该是:

if((last-first)<2):

答案 1 :(得分:1)

在整个代码中添加更多print次调用以查找实际情况会很有帮助。首先查看搜索结果:

def search(s,e):
    print(bsearch(s,e,0,len(s)-1,1))

你会看到它直接返回False。你已经知道它没有递归,所以必须意外地击中这个分支:

if((first-last)<2):
    return (s[first]==e or s[last]==e)

添加print(first - last)以找出为什么它会去那里。在你的例子中,它将打印-14,肯定少于两个。将其更改为测试last - first,它将为您提供这一系列调用:

0 14 1
0 6 2
4 6 3
4 4 4

并最终按预期返回True