【问题标题】:recursive mergeflow max recursion exceeded超出递归合并流最大递归
【发布时间】:2017-05-10 21:45:37
【问题描述】:

我正在尝试为在线课程实现递归合并流并且有一个小问题。

分而治之的代码如下所示:

def __recursive_mergesort(arr, aux, lo, hi):
    if hi <= lo:
        return
    mid = lo + (hi - lo) // 2

    __recursive_mergesort(arr, aux, lo, mid)
    __recursive_mergesort(arr, aux, mid + 1, hi)
    # Call merge here...


def mergesort(x):
    aux = [0] * len(x)
    __recursive_mergesort(x, aux, 0, len(x) - 1)
    return x

但是,当我这样做时:

def __recursive_mergesort(arr, aux, lo, hi):
    if hi <= lo:
        return
    mid = lo + (hi - lo) // 2

    __recursive_mergesort(arr, aux, lo, mid)
    __recursive_mergesort(arr, aux, mid, hi)
    # Call merge here...


def mergesort(x):
    aux = [0] * len(x)
    __recursive_mergesort(x, aux, 0, len(x))
    return x

这超出了最大递归深度。据我所知,我没有更改逻辑,并且在调试时遇到了麻烦。当然,这里潜伏着一个微妙或不那么微妙的错误,但对于我的生活,我无法弄清楚为什么第一个版本运行而不是第二个版本。

【问题讨论】:

    标签: python recursion mergesort


    【解决方案1】:

    我很确定问题在于您的基本情况:

    if hi <= lo:
        return
    

    如果您的第二次递归调用未将1 添加到中间,则永远不会发生。考虑一下,我们进入重点

    hi = 1; lo = 0; mid = 0
    

    那么我们对mid 的计算结果为:

    In [21]: hi = 1; lo = 0; mid = 0
    
    In [22]: lo + (hi - lo) // 2
    Out[22]: 0
    

    然后您将其传递给 __recursive_mergesort(arr, aux, mid, hi) 并使用完全相同的值,因此您将获得无限递归。

    【讨论】:

    • 谢谢。我意识到将条件更改为 ` if hi - 1
    猜你喜欢
    • 2016-12-10
    • 2018-12-03
    • 1970-01-01
    • 2013-12-01
    • 2019-07-03
    • 1970-01-01
    • 2020-09-30
    • 2017-03-24
    相关资源
    最近更新 更多