【问题标题】:Maximum Recursion Depth reached Merge Sort达到最大递归深度合并排序
【发布时间】:2017-02-07 21:16:16
【问题描述】:

我一直在尝试实现归并排序,但一直遇到“最大递归深度”错误。我目前的理论是“如果listlen

def mergesort(listin):
    listlen = len(listin)

    if listlen <= 1:
        return listin

    left = []
    right = []
    i = 0
    while i < listlen:
        if i <= listlen / 2:
            left.append(listin[i])
        else:
            right.append(listin[i])
        i += 1

    left = mergesort(left)
    right = mergesort(right)


    return merge(left, right)

def merge(listlef, listrig):
    result = []

    while len(listlef) != 0 and len(listrig) != 0:
        if listlef[0] <= listrig[0]:
            result.append(listlef[0])
            listlef = listlef[1:]
        else:
            result.append(listrig[0])
            listrig = listrig[1:]

    while len(listlef) != 0:
        result.append(listlef[0])
        listlef = listlef[1:]
    while len(listrig) != 0:
        result.append(listrig[0])
        listrig = listrig[1:]

    return result

【问题讨论】:

  • 可能不相关,但如果您使用的是 python 3,listlen / 2 返回一个浮点数。你必须做//(适用于所有python版本)
  • 如果输入足够长,最大递归错误是不可避免的。
  • 忘了补充,这发生在低至 2 个数字
  • 要拆分listin,只需将其切片两次。 k = listlen//2; left = listin[:k]; right = listin[k:]。有了这个,应该没有递归问题。这不是您的直接问题,但在merge 中,输入的重复切片使其比应有的慢得多。
  • 为了更好地查看现有代码在做什么,请在递归 mergesort 调用之前和之后添加 print(left, right)

标签: python recursion mergesort


【解决方案1】:

对于大小为 2 的列表,请注意 i 只会是 0 和 1,两者都小于或等于 2/1 == 1。

不过,不要摆弄索引,只需交替附加到哪个列表即可:

left = []
right = []
for item in listin:
    left.append(item)
    left, right = right, left

【讨论】:

  • 我会假装我想指出这种技术,而不是仅仅忽略 cmets 中提到的明显解决方案。
猜你喜欢
  • 2019-01-21
  • 2011-01-09
  • 2016-06-14
  • 2017-10-11
  • 2015-06-08
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
相关资源
最近更新 更多