繁体   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