【问题标题】:Segmentation Fault when running recursive binary search algorithm运行递归二进制搜索算法时出现分段错误
【发布时间】:2018-02-03 02:54:32
【问题描述】:

所以我第一次尝试递归,在 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)

【问题讨论】:

  • 没有办法使用二进制搜索需要那么多递归调用。没有这么大的数组可以放入内存。
  • 我还没有检查你的代码,但是如果你在这么小的数据结构上遇到递归错误,那么你的算法做错了。 (一般遇到递归错误说明你做错了什么,或者你的问题不是递归问题,不应该有递归解决方案)
  • 您的代码没有规定x 不在arr 中。在这种情况下,您希望它返回什么? (另外,您可能应该返回 mid 而不是 x
  • 这里有一些错误。 start = 0 就是其中之一。另一个是您没有检查基本情况start &gt; end
  • “我无法想象 Python 不支持深度递归?” - Python 肯定支持深度递归,但 无限 内存不是。即使您将最大递归级别设置为较大的数字,解释器仍然可能会耗尽内存。

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


【解决方案1】:

您的代码中有几个错误:

  1. 您没有基本案例。您应该在进行递归之前检查是否start &gt; end
  2. start = 0 真的应该是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

另外,请注意,对于O(logN) 算法,您永远不会需要 40,000 的最大递归深度。如果您遇到“超出最大递归深度”错误,您应该首先重新评估您的算法。

【讨论】:

  • @ChristianDean 谢谢你,你也是。这周对我来说有点忙:)
  • @newcoder 欢迎!在编写递归例程时,请务必检查您的基本情况。
猜你喜欢
  • 1970-01-01
  • 2020-09-06
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
  • 2022-08-02
  • 1970-01-01
  • 2017-02-05
相关资源
最近更新 更多