运行递归二进制搜索算法时的分段错误

时间:2018-02-03 02:54:33

标签: python python-3.x recursion binary-search

所以我第一次尝试递归,在Python 3中编写一个简单的二进制搜索算法。运行我的程序后,我收到了这个错误:调用Python对象时超出了最大递归深度 我做了一些研究,并说要添加这一行:sys.setrecursionlimit(40000)

我做了什么。当我输入不在我的列表中的数字时,我得到此分段错误错误。我读了这个post从我在Python中收集到的深度递归耗尽了内存?

我无法想象Python中不支持深度递归?无论如何,这是我的代码:

import sys

arr = [5, 17, 23, 33, 39, 44, 58, 62, 70, 74, 82, 99]
end = len(arr)
sys.setrecursionlimit(40000)

def binarySearch(arr, start, end,  x):

   #print("This is end: {}".format(end))
    mid = int((end + start)/2)
    #print("This is start {}".format(start))
    #print("This is end {}".format(end))
    #print("This is mid {}".format(mid))

    if x == arr[mid]:
        return x
    elif (x < arr[mid]):
        start = 0
        end = mid - 1
        return binarySearch(arr, start, end, x)
    else: # if x > arr[mid]
        start = mid + 1
        end = end
        return binarySearch(arr, start, end,  x)


position = binarySearch(arr, 0, 12, 55)
print(position)

1 个答案:

答案 0 :(得分:5)

您的代码中有一些错误:

  1. 您没有基本案例。在进行递归之前,你应该检查是否def adjacentElementsProduct(inputArray) index = 0 length = inputArray.length max = 0 while index < length-1 do result = inputArray[index] * inputArray[index+1] max = result if result > max index += 1 end max end
  2. start > end确实应该是start = 0,或者根本不添加。
  3. 修复这些错误,并稍微清理一下代码,这有效 -

    start = start

    def binarySearch(arr, start, end, x):
        if start <= end:
            mid = (end + start) // 2
    
            if x == arr[mid]:
                return mid
            elif x < arr[mid]:
                end = mid - 1           
            else:
                start = mid + 1
    
            return binarySearch(arr, start, end, x)
    
        return -1
    

    另外,请注意,对于binarySearch(arr, 0, len(arr), 55) -1 binarySearch(arr, 0, len(arr), 58) 6 算法,您永远不会需要最大40,000的递归深度。如果您遇到“超出最大递归深度”错误,则应首先重新评估算法。