【问题标题】:Recursive binary search in Python hits the recursion ceilingPython 中的递归二分搜索达到了递归上限
【发布时间】:2015-11-05 18:54:14
【问题描述】:

所以我正在用 Python 编写一个递归二进制搜索算法,它运行良好......除非我尝试了某个数字。

我正在处理已排序的 10,000 个随机数字的列表。

它最终会因为这个错误而失败:

RecursionError: maximum recursion depth exceeded while calling a Python object

我在函数内部放置了计数器来跟踪低点/高点和当前搜索计数。当我运行 bSearch(3333) 时,我得到了上述错误和这个奇怪的输出......

0 None 1
0 4998 2
0 2498 3
0 1248 4
0 623 5
312 623 6
312 466 7
312 388 8
312 349 9
331 349 10
331 339 11
336 339 12
338 339 13
338 337 14
338 337 15

它只是不断重复 338 337 直到达到诅咒上限。

这是我的功能:

def bSearch(list, value, lowPoint=0, highPoint=None, searchNum=1):
    print(lowPoint,highPoint,searchNum)
    searchNum += 1
    if highPoint is None:
        highPoint = len(list) - 1
    if lowPoint == highPoint:
        if list[lowPoint] == value:
            return lowPoint, searchNum
        else:
            return -1, searchNum
    midPoint = (lowPoint + highPoint) // 2
    if list[midPoint] > value:
        return bSearch(list, value, lowPoint, midPoint - 1, searchNum)
    elif list[midPoint] < value:
        return bSearch(list, value, midPoint + 1, highPoint, searchNum)
    else:
        return midPoint

【问题讨论】:

    标签: python recursion binary-search


    【解决方案1】:

    原因是您没有处理一个终止条件。当您的下限高于上限时,这意味着您正在搜索的元素不在列表中,您应该在那里返回 -1。

    def bSearch(list, value, lowPoint=0, highPoint=None, searchNum=1):
        print(lowPoint,highPoint,searchNum)
        searchNum += 1
        if highPoint is None:
            highPoint = len(list) - 1
        if lowPoint == highPoint:
            if list[lowPoint] == value:
                return lowPoint, searchNum
            else:
                return -1, searchNum
        if lowPoint > highPoint:
            return -1,searchNum
        midPoint = (lowPoint + highPoint) // 2
        if list[midPoint] > value:
            return bSearch(list, value, lowPoint, midPoint - 1, searchNum)
        elif list[midPoint] < value:
            return bSearch(list, value, midPoint + 1, highPoint, searchNum)
        else:
            return midPoint
    

    【讨论】:

    • -__- 应该通过更多的考虑终止条件!谢谢!
    • 我也只是像这样将两者结合起来:if lowPoint >= highPoint:
    • 是的,有道理\m/
    猜你喜欢
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 2021-07-03
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多