我已经编写了这个代码,用于二进制搜索列表中的元素。 代码达到最大递归。我无法弄清楚为什么。
def binary_search(alist, x, left = 0, right = None):
right = right or len(alist) - 1
middle = left + (right - left) // 2
if x == alist[middle]:
return middle
elif right < left:
return -1
elif x < alist[middle]:
return binary_search(alist, x, left, middle - 1)
elif x > alist[middle]:
return binary_search(alist, x, middle + 1, right)
if __name__ == '__main__':
a = [2, 3, 4, 5, 6,7,8,9,10,11]
data = [1, 2, 3, 4, 5, 6, 7,8,9,10,11, 12]
for x in data:
print(binary_search(a, x), end = ' ')
答案 0 :(得分:0)
如果您尝试搜索的x
小于alist
最左侧的元素,您迟早会得到right=0
。由于0
是一个假值,binary_search
的第一行会将其重置为len(alist) - 1
,并开始整个过程,由于最大递归命中,这将在某些时候失败。
您可以通过仅使用列表的长度显式替换None
而不是任何错误值(例如0
)来解决此问题:
right = right if right is not None else len(alist) - 1
答案 1 :(得分:0)
对于大于列表中最高值的值,right将达到列表的大小。在这种情况下,你计算右边是len(aList) - 1,它将它带回左边==右边,然后再次使用left = len(aList)-1和right = len(aList)。 ==&GT;无限递归。
你应该计算中=(左+右)// 2
你也可以这样做:
def binSearch(value,array,offset=0):
if len(array) == 0 : return None
i = len(array)//2
if array[i] < value : return binSearch(value,array[i+1:],i+1+offset)
if array[i] > value : return binSearch(value,array[:i],offset)
return i + offset