Python中的递归二进制搜索树

时间:2018-03-22 19:36:06

标签: python python-3.x

我已经编写了这个代码,用于二进制搜索列表中的元素。 代码达到最大递归。我无法弄清楚为什么。

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 = ' ')

2 个答案:

答案 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