【问题标题】:Binary Search RecursionError: maximum recursion depth exceeded in comparisonBinary Search RecursionError:比较超过最大递归深度
【发布时间】:2022-01-22 17:03:09
【问题描述】:

我试图在 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

【问题讨论】:

    标签: python algorithm recursion binary-search recursionerror


    【解决方案1】:

    你的错误在于这一行:

        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 保持不变,因为你总是在划分r 而没有考虑lmid 永远不会改变。所以,你会得到一个超出递归深度的错误。

    此外,搜索的上限是n-1,其中n 是数组的长度。如果您的函数调用中的n 是数组的长度(从代码中看不出来),您需要减去一个,如下所示:

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

    【讨论】:

      【解决方案2】:

      如果在列表中找不到该项目,则递归永远不会收敛。这里有两个错误:

      1. r 的起始值应该是 n-1,而不是 n
      2. mid 的计算不应减去1。即,它应该是mid = (l+r)//2

      把这些放在一起,你会得到:

      def binarySearch(a,k,l,r):
      
          if l > r:
              return -1
          else:
              mid = (l+r)//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
      

      【讨论】:

        猜你喜欢
        • 2019-03-23
        • 2020-03-14
        • 1970-01-01
        • 2020-04-01
        • 2019-04-18
        • 2021-02-13
        • 2021-03-23
        • 2017-11-05
        • 2013-11-30
        相关资源
        最近更新 更多