使用伪代码时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
参数传递。