Python列表创建差异

时间:2019-01-03 23:15:38

标签: python-3.x list recursion

我正在尝试创建一个递归函数以将列表从低到高排序。 以下代码不起作用

less = []
greater = []
def quicksort(array):
    if len(array)<2:
        return array
    else:
        pivot = array[0]
        for i in array[1:]:
            if i <= pivot:
                less.append(i)
            else:
                greater.append(i)
        return quicksort(less)+[pivot]+quicksort(greater)
print(quicksort([1,3,2,7,8]))

但是我使用书代码,它可以工作。你能告诉我为什么吗?

def quicksort(array):
    if len(array)<2:
        return array
    else:
        pivot = array[0]
        less = [i for i in array[1:] if  i <= pivot]
        greater = [i for i in array[1:] if i > pivot]
        return quicksort(less)+[pivot]+quicksort(greater)
print(quicksort([1,3,2,7,8]))

1 个答案:

答案 0 :(得分:2)

您正在使用 global lessgreater list s,因此最终将建立list s越来越大,多次重复输入(大致与您递归调用quicksort的次数成正比)。 lessgreater不断增长,直到您突破堆栈深度限制或内存不足,Python死了以保护自己免受侵害。

更糟糕的是,您保留了调用之间的状态,因此quicksort的第二件事和后续事情最终包括了先前排序操作中的垃圾,即使它们在输入上是如此之短,您也可以对其进行琐碎的“排序”。如果将less / greater设置为本地,并在每次调用中重新初始化它们,则代码将起作用:

def quicksort(array):
    if len(array)<2:
        return array
    else:
        pivot = array[0]
        less = []     # Local!
        greater = []  # Local!
        for i in array[1:]:
            if i <= pivot:
                less.append(i)
            else:
                greater.append(i)
        return quicksort(less)+[pivot]+quicksort(greater)