所以我正在尝试制作递归二进制搜索算法,这是我正在使用的伪代码:
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)
这是我的计划:
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)
因此,每当我使用不在列表中的值时,我都会收到索引错误,但它可以很好地查找列表中的值,任何帮助都将非常感激
答案 0 :(得分:0)
你正在使用&#39; start&#39;并且&#39;结束&#39;正常吗?我刚刚运行了你的函数,它适用于不在列表中的值(返回False)。
答案 1 :(得分:0)
由于已经给出了答案,我建议你尝试从另一个角度解决问题 - 通过测试:
每当我使用一个不在列表中的值,但它可以正常查找列表中的值
有趣的是,代码不会在不在数组中的每个数字上失败。尝试使用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