在Python中使用递归排序函数

时间:2017-02-15 03:17:19

标签: python sorting recursion

我有这个功能gensortremAll

def gensort(L):
""" Sorts list L in ascending order
"""

if len(L) == 0:
    return 0
else:
    z = min(L)
    L = remAll(z, L)
    return [z] + gensort(L)


def remAll( e, L ):
""" Helper function for gensort(), removes all e in L.
"""
if len(L) == 0: 
    return L

elif L[0] != e:
    return L[0:1] + remAll(e,L[1:])
else:
    return      remAll(e,L[1:])

当我运行gensort时,我收到错误

  

只能将列表(不是'int')连接到列表。

remAll运行正常。如果我尝试创建一个空列表来添加z,我会收到不同的错误。

3 个答案:

答案 0 :(得分:0)

您的错误源于基本案例检查,即return 0。只需返回空列表L。

如果在删除功能中没有使用递归的特殊原因,我可以建议

def remAll(e, L):
    return [x for x in L if x != e]

另外注意,此排序方法会删除重复项。

答案 1 :(得分:0)

def gensort(L):
  if len(L) == 0:
    return 0       # <---- A
  else:
    z = min(L)
    L = remAll(z, L)
    return [z] + gensort(L)     # <---- B

在行A中,如果L为空,则返回数字0。因此,在递归调用后,您将在行B中获得[z] + 0,这是一个错误,因为您无法添加列表和数字。

你应该返回一个空列表,你应该写一下

    return []

代表A行。

答案 2 :(得分:0)

问题是因为递归的基本情况是返回0而不是空列表。更改以下代码:

if len(L) == 0:   
    return 0

if len(L) == 0:   
    return []

它应该有效。