如何在python中进行二进制搜索(递归),但不包括列表的最大值和最小值?
我一直想做二进制搜索(通过递归),但我不知道为什么我的代码不起作用。。。 任何人都可以纠正我的代码,并告诉原因,为什么它不工作 正如您在我的代码中所看到的,我正在对每个递归的字符串进行切片,最后当找到目标时,我将返回目标的位置如何在python中进行二进制搜索(递归),但不包括列表的最大值和最小值?,python,Python,我一直想做二进制搜索(通过递归),但我不知道为什么我的代码不起作用。。。 任何人都可以纠正我的代码,并告诉原因,为什么它不工作 正如您在我的代码中所看到的,我正在对每个递归的字符串进行切片,最后当找到目标时,我将返回目标的位置 def binary(n,target): n.sort() mid = (0 + (len(n)-1))//2 if target == n[mid]: return mid elif target < n[mid]
def binary(n,target):
n.sort()
mid = (0 + (len(n)-1))//2
if target == n[mid]:
return mid
elif target < n[mid]:
return binary(n[:mid],target)
elif target > n[mid]:
return binary(n[mid:],target)
def二进制文件(n,目标):
n、 排序()
mid=(0+(len(n)-1))//2
如果目标==n[mid]:
中途返回
elif目标递归错误:调用Python对象时超出了最大递归深度。您的中点计算过于激进: 考虑
n=[1,2,3]
和target=3
。mid(len(n)-1//2
)随后将是0
,当然它应该是1或2。问题源于从长度中减去1,然后将结果除以2
由于您总是进行整数除法,因此无需减去一:
def binary(n,target):
n.sort()
mid = len(n)//2
...
还有一个问题是,每次输入binary
时都会对列表(段)进行排序,这是不必要的。您可以编写一个包装函数,对列表进行一次排序,然后调用内部递归函数:
def binary(n, target):
return _binary(sorted(n), target)
然后将原始函数重命名为\u binary
最后,从左侧剪切时,您需要确保跟踪需要添加到索引中的丢失号码:
elif target > n[mid]:
return mid + binary(n[mid:],target)
有两个问题,都在最后一行:
def binary(n, target):
n.sort()
mid = (0 + (len(n) - 1)) // 2
if target == n[mid]:
return mid
elif target < n[mid]:
return binary(n[:mid], target)
elif target > n[mid]:
return mid + 1 + binary(n[mid + 1:],target)
^^^^^^^^ ^
注释:通过每次迭代调用n.sort()
,我们“失去”了二进制搜索的所有优势,因为即使在对列表进行排序之后,重新排序也至少需要O(n)。因此,如果我们需要先排序,我们不妨迭代数组,直到找到/未找到该项。或者,如果我们坚持排序,只执行一次,然后递归调用:
n.sort()
binary(n, 2)
其中,binary
不再包括排序:
def binary(n, target):
mid = (0 + (len(n) - 1)) // 2
if target == n[mid]:
return mid
elif target < n[mid]:
return binary(n[:mid], target)
elif target > n[mid]:
return mid + 1 + binary(n[mid + 1:], target)
def二进制文件(n,目标):
mid=(0+(len(n)-1))//2
如果目标==n[mid]:
中途返回
elif目标打印出
n
和mid
以查看发生了什么?此外,您多次对列表(段)进行不必要的排序。我假设mid变为0。检查此链接是的,它工作了。。。!你能告诉我。。。为什么我们要做mid+1+二进制(n[mid+1:],target)???我无法理解…@AryanKumar解释在上面的第2页
def binary(n, target):
mid = (0 + (len(n) - 1)) // 2
if target == n[mid]:
return mid
elif target < n[mid]:
return binary(n[:mid], target)
elif target > n[mid]:
return mid + 1 + binary(n[mid + 1:], target)