如何在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目标n[中间]: 返回二进制(n[mid:],目标) 这是我收到的错误消息。。。
递归错误:调用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+1+二进制(n[mid+1:],目标)
打印出
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)