簡體   English   中英

遞歸導致嵌套列表

[英]Recursion results in nested lists

運行我的函數frisbeeSort()總是會導致列表被排序,但每個項目都在嵌套列表中。 我想遞歸地更改原始列表,而不是使用臨時列表。

def frisbeeSort(n):
    index = n.index(min(n))
    if len(n) == 1:
        return n[0]
    else:
        n[0:index + 1] = n[index::-1]
        n = [n[0], frisbeeSort(n[1:])]
    return n

list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1]

我預計

[1, 12, 12, 13, 34, 42, 45, 76, 98, 234]

但我不斷

[1, [12, [12, [13, [34, [42, [45, [76, [98, 234]]]]]]]]]

len(n) == 1時,您返回一個項目,而不是列表。 您還錯誤地串聯了兩個列表。 嘗試這個:

def frisbeeSort(n):
    index = n.index(min(n))
    if len(n) == 1:
        return [n[0]]
    else:
        n[0:index + 1] = n[index::-1]
        n = [n[0]] + frisbeeSort(n[1:])
    return n

list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1]
print(frisbeeSort(list1))

輸出:

[1, 12, 12, 13, 34, 42, 45, 76, 98, 234]

我想遞歸地更改原始列表,而不是使用臨時列表

盡管接受的答案解決了“嵌套列表”問題,但我認為它不能滿足上述期望。 也就是說,如果您這樣做:

list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1]
print(frisbeeSort(list1))
print(list1)

你得到:

> python3 test.py
[1, 12, 12, 13, 34, 42, 45, 76, 98, 234]
[1, 234, 98, 13, 45, 76, 12, 34, 42, 12]
>

list1被更改但未排序的位置。 這是解決使用OP算法對列表進行即時排序的一種方法:

def frisbeeSort(n, start=0):
    if start < len(n):
        index = n.index(min(n[start:]), start)
        n[start:index + 1] = n[start:index + 1][::-1]
        frisbeeSort(n, start + 1)

list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1]
frisbeeSort(list1)
print(list1)

輸出值

> python3 test.py
[1, 12, 12, 13, 34, 42, 45, 76, 98, 234]
>

您能解釋一下什么完全改變了原始列表,而不是返回排序列表嗎?

有兩件事可以使這種情況發生。 首先,(默認)第二個start參數:

def frisbeeSort(n, start=0):

這使我們可以保留在遞歸調用上排序的初始元素:

 frisbeeSort(n, start + 1)

並告訴我們從哪里開始新的最小搜索:

 index = n.index(min(n[start:]), start)

第二,將賦值返回數組本身:

n[start:index + 1] = n[start:index + 1][::-1]

我們將剩余的未排序元素替換為相同的值。 右側的臨時陣列被扔掉,原始陣列被更新。

當您編寫[n[0], frisbeeSort(n[1:])] ,它將創建一個包含兩個元素的列表,其中第一個元素為n[0] ,第二個元素為frisbeeSort(n[1:]) n[0]返回的值frisbeeSort(n[1:]) (列表)。 如果要將它們加入平面列表,可以編寫[n[0]] + frisbeeSort(n[1:])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM