[英]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.