【发布时间】: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