Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的递归二叉搜索树_Python_Python 3.x - Fatal编程技术网

Python中的递归二叉搜索树

Python中的递归二叉搜索树,python,python-3.x,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:

我编写了这段代码,用于对列表中的元素进行二进制搜索。 代码达到最大递归。我不明白为什么

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 = ' ')
def二进制搜索(列表,x,左=0,右=None):
右=右或len(列表)-1
中间=左+(右-左)//2
如果x==alist[中间]:
返回中间
elif rightalist[中间]:
返回二进制搜索(列表,x,中间+1,右)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
a=[2,3,4,5,6,7,8,9,10,11]
数据=[1,2,3,4,5,6,7,8,9,10,11,12]
对于数据中的x:
打印(二进制搜索(a,x),结束=“”)

如果您尝试搜索小于
列表最左边元素的
x
,您迟早会得到
right=0
。由于
0
是一个假值,因此
二进制搜索的第一行将把它重置为
len(alist)-1
,并重新开始整个过程,这将在某个时候由于最大递归命中而失败

您只需将
None
显式替换为列表长度,而不替换任何假值(例如
0
),即可解决此问题:


对于大于列表中最高值的值,right将达到列表的大小。在这种情况下,您计算right to be len(aList)-1,这会使它回到left==right,并使它再次使用left=len(aList)-1和right=len(aList)。==>无限递归

您应该计算middle=(左+右)//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
def binSearch(值、数组、偏移量=0): 如果len(数组)==0:返回None i=len(数组)//2 如果数组[i]value:return-bin搜索(值,数组[:i],偏移量) 返回i+偏移量
打开和关闭“为什么此代码不起作用?”的案例关闭原因。想想当
right==0
时会发生什么。你做了什么来尝试“找出原因”?
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