【问题标题】:Python List Creation DifferencePython列表创建差异
【发布时间】:2019-01-03 23:15:37
【问题描述】:

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

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]))

【问题讨论】:

    标签: python-3.x list recursion


    【解决方案1】:

    你正在使用 global lessgreater lists,所以你最终会建立越来越大的 lists,重复你的多次输入(大致与您递归调用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)
    

    【讨论】:

      猜你喜欢
      • 2015-01-19
      • 2021-08-04
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多