错误:递归实现合并排序时,类型为'NoneType'的对象没有len()

时间:2019-08-21 17:42:26

标签: recursion python-3.7 mergesort

我正在尝试使用python 3.7实现合并排序。为此,我编写了merge()函数和递归sort()函数。在这里,sort()函数将中断列表,直到它具有一个元素为止。但是问题是解释器无法将合并函数的参数m和n识别为列表,因此显示以下错误:

def merge(m, n):
    x = y = 0
    v = []
    while x < len(m) and y < len(n):
        if m[x] < n[y]:
            v.append(m[x])
            x = x + 1
        elif m[x] > n[y]:
            v.append(n[y])
            y = y + 1
        else:
            v.append(m[x])
            x, y = x + 1, y + 1
    while x < len(m):
        v.append(m[x])
        x = x + 1
    while y < len(n):
        v.append(n[y])
        y = y + 1
    return v

def sort(a):
    if len(a) == 1:
        return a
    else:
        merge(sort(a[:len(a) // 2]), sort(a[len(a) // 2:]))

x = list(range(10, 0, -1))
sort(x)
print(x)

预期结果ID为排序列表。

但是python显示此错误:

回溯(最近通话最近):       文件“”,第1行,位于         排序(x)       文件“”,第5行,排序         merge(sort(a [:len(a)// 2]),sort(a [len(a)// 2:]))       文件“”,第5行,排序         merge(sort(a [:len(a)// 2]),sort(a [len(a)// 2:]))       文件“”,第5行,排序         merge(sort(a [:len(a)// 2]),sort(a [len(a)// 2:]))       合并中的文件“”,第4行         而x

2 个答案:

答案 0 :(得分:0)

重点是您的排序函数的确会在len(a)== 1的情况下返回a,但在len(a)!= 1的情况下不返回任何内容。它应该返回的是merge(…)而不是merge(…)在您排序的其他部分。

答案 1 :(得分:0)

修复注释中指出的问题。或者,可以一次性分配工作数组,并且合并排序将仅使用索引,而不是制作数组的多个副本。

def merge(m, n):
    x = y = 0
    v = []
    while x < len(m) and y < len(n):
        if m[x] <= n[y]:                # fix
            v.append(m[x])
            x = x + 1
        else:
            v.append(n[y])
            y = y + 1
    while x < len(m):
        v.append(m[x])
        x = x + 1
    while y < len(n):
        v.append(n[y])
        y = y + 1
    return(v)

def sort(a):
    if len(a) == 1:
        return(a)
    else:
        return(merge(sort(a[:(len(a)//2)]), sort(a[len(a)//2:])))

# test sort
x = list(range(10, 0, -1))
x = sort(x)                             # fix
print(x)