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