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