使用伪代码时Python二进制搜索算法出错

使用伪代码时Python二进制搜索算法出错,python,algorithm,recursion,indexing,Python,Algorithm,Recursion,Indexing,所以我尝试做一个递归二进制搜索算法,下面是我使用的伪代码: BINARY-SEARCH(X, A, start, end) 1 if start > end then 2 return False 3 middle = ((end - start) / 2) + start 4 if X = A[middle] then 5 return True 6 else if X < A[middle] then 7 return BINARY-SEARCH(

所以我尝试做一个递归二进制搜索算法,下面是我使用的伪代码:

BINARY-SEARCH(X, A, start, end)
1  if start > end then
2     return False
3  middle = ((end - start) / 2) + start
4  if X = A[middle] then
5     return True
6  else if X < A[middle] then
7     return BINARY-SEARCH(X, A, start, middle - 1)
8  else
9     return BINARY-SEARCH(X, A, middle + 1, end)
二进制搜索(X,A,开始,结束)
1如果开始>结束,则
2返回错误
3中间=((结束-开始)/2)+开始
4如果X=A[中间],则
5返回真值
6否则,如果X
这是我的节目:

def binarySearchRec(value, list, start, end):
    if start > end:
        return False
    middle = ((end - start) / 2) + start
    if value == list[middle]:
        return True
    elif value < list[middle]:
        return binarySearchRec(value, list, start, middle - 1)
    else:
        return binarySearchRec(value, list, middle + 1, end)
def binarySearchRec(值、列表、开始、结束):
如果开始>结束:
返回错误
中间=((结束-开始)/2)+开始
如果值==列表[中间]:
返回真值
elif值<列表[中间]:
返回binarySearchRec(值、列表、开始、中间-1)
其他:
返回binarySearchRec(值,列表,中间+1,结束)

因此,每当我使用不在列表中的值时,总是会出现索引错误,但它可以很好地查找列表中的值,如果您能提供帮助,我们将不胜感激。

您是否正确使用了“开始”和“结束”?我刚刚运行了你的函数,它对列表中没有的值很有效(返回False)。

因为答案已经给出了,我建议你尝试从另一个角度来解决这个问题-通过测试它:

每当我使用一个不在列表中的值,但它可以很好地查找列表中的值时

有趣的是,代码并不是在数组中的每个数字上都失败。尝试使用
array=range(1,10,2)
并搜索例如2、4、6、8——所有这些都不在数组中。它会起作用的。搜索10将失败。这暗示限制检查可能有问题,而不是实现本身

任何帮助都将不胜感激

下面是一种测试函数并快速查看失败数字的方法:

from itertools import izip_longest as izipl
def complement(a):
    return list(set(range(min(a), max(a) + 10)) - set(a))
array = range(1,10,2)
c_array = complement(array)
start = 0
end = len(array) # that's the culprit
try:
    for a,b in izipl(array, c_array):
        if a:
            assert binarySearchRec(a, array, start, end), "expected to find %s" % a
        if b:
            assert not binarySearchRec(b, array, start, end), "did not expect to find %s" % b
        print  "worked on", a, b
except:
    print "failed on", a, b
else:
    print "all is well"
=> 
worked on 1 2
worked on 3 4
worked on 5 6
worked on 7 8
failed on 9 10

提示:python列表是零索引的。您能给我们举个例子说明产品的值、列表、开始和结束吗?此外,您可能希望使用除list之外的变量名,因为您正在踩踏内置类型。当我使用列表类型时,我通常使用数据作为名称。伪代码使用包含上界,这意味着
end
是一个有效的索引。您必须将
len(a)-1
作为
end
参数传递。