python - 二分查找递归错误: maximum recursion depth exceeded in comparison

标签 python algorithm recursion binary-search recursionerror

我试图在 python 中执行二分查找程序。我遵循了算法步骤,但它给了我这个错误。这是我的代码:

def binarySearch(a,k,l,r):
    
    if l > r:
        return -1
    else:
        mid = (l+(r-l))//2
        if(a[mid]>k):
            return binarySearch(a,k,l,mid-1)
        elif(a[mid]<k):
            return binarySearch(a,k,mid+1,r)
        else:
            return mid


t = int(input("Enter no. of test cases: "))
for _ in range(t):
    n,k = map(int, input().split())
    a = list(map(int, input().rstrip().split()))
    print(binarySearch(a,k,0,n))

错误:

    return binarySearch(a,k,mid+1,r)
  File "e:/Coding/Algorithms/Searching/binarySearch.py", line 10, in binarySearch
    return binarySearch(a,k,mid+1,r)
  File "e:/Coding/Algorithms/Searching/binarySearch.py", line 10, in binarySearch
    return binarySearch(a,k,mid+1,r)  [Previous line repeated 994 more times]
  File "e:/Coding/Algorithms/Searching/binarySearch.py", line 3, in binarySearch    if r < l:
RecursionError: maximum recursion depth exceeded in comparison

最佳答案

您的错误在于这一行:

    else:
        mid = (l+(r-l))//2

您需要除以(r-l)//2,然后添加l,但您正在做(l+(r-l))//2 结果是 (l+r-l)//2 == r//2

将其更改为l + (r-l)//2

当这个条件成立时会发生什么:

        elif(a[mid]<k):
            return binarySearch(a,k,mid+1,r)

r 保持不变,并且由于您总是在不考虑 l 的情况下除以 r,因此 mid 永远不会改变。因此,您会收到递归深度超出错误。

此外,搜索的上限为 n-1,其中 n 是数组的长度。如果函数调用中的 n 是数组的长度(从代码中看不出来),则需要按如下方式减一:

binarySearch(a,k,0,n-1))

关于python - 二分查找递归错误: maximum recursion depth exceeded in comparison,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70432663/

相关文章:

python - 从文本文件正则表达式Python中读取并选择特定行

java - 打破听众的递归

c++ - 显着增加内存的使用

php - 从父子关系构建关联数组

python - 如何使用 S3 Select 和制表符分隔的 csv 文件

python - 我可以使用 Python 的 setuptools 指定冲突的包吗?

algorithm - 这在计算复杂性方面有多难?

javascript - 如何递归地查找字符串中的一组字符?

java - 如何在多树中找到最大的公共(public)子树

python - 生成 float 列表,其中每个数字小于另一个 float 列表的数字