【问题标题】:swap elements of list in recursive call python在递归调用python中交换列表的元素
【发布时间】:2017-10-23 10:40:39
【问题描述】:

我想让简单的函数交换列表中的随机元素。 但它在递归调用中不起作用。

在第一次递归调用中,元素交换工作, 但是嵌套递归调用(或第一次递归调用中的嵌套递归调用)不起作用。

我不知道为什么只交换第一个递归调用有效。

以下是结果。

谢谢大家。

def change(lst):
    if len(lst)>4:
        a, b = np.random.randint(0, len(lst)), np.random.randint(0, len(lst))
        print(lst)
        lst[a], lst[b] = lst[b], lst[a]
        print(lst)
        mid = int(len(lst)/2)
        change(lst[:mid])
        change(lst[mid:])
k = list(range(0, 20))
change(k)
print(k)

`

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[0, 19, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 1]
[0, 19, 2, 3, 4, 5, 6, 7, 8, 9]
[3, 19, 2, 0, 4, 5, 6, 7, 8, 9]
[3, 19, 2, 0, 4]
[3, 0, 2, 19, 4]
[5, 6, 7, 8, 9]
[5, 6, 8, 7, 9]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 1]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 1]
[10, 11, 12, 13, 14]
[10, 14, 12, 13, 11]
[15, 16, 17, 18, 1]
[15, 16, 17, 18, 1]
[0, 19, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 1] <= result. 

【问题讨论】:

标签: python recursion swap


【解决方案1】:

问题是在你的递归调用中:

change(lst[:mid])
change(lst[mid:])

您使用切片运算符。切片运算符构造一个新列表,因此您的更改是在新列表中进行的,并且不会反映在原始列表中(因为它是一个副本 em>)。

你可以做的是使用索引来代替:

def change(lst,frm=0,to=None):
    if to is None: # set the default to the end of the list
        to = len(lst)
    if to-frm > 4:
        a, b = np.random.randint(frm,to), np.random.randint(frm,to)
        print(lst)
        lst[a], lst[b] = lst[b], lst[a]
        print(lst)
        mid = (frm+to)//2
        change(lst,frm,mid)
        change(lst,mid,to)

那么我们得到:

>>> k = list(range(0, 20))
>>> change(k)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2, 3, 4, 12, 6, 7, 8, 9, 10, 11, 5, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2, 3, 4, 12, 6, 7, 8, 9, 10, 11, 5, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2, 3, 4, 12, 6, 7, 8, 9, 10, 11, 5, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 2, 3, 4, 12, 6, 7, 8, 9, 10, 11, 5, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 4, 3, 2, 12, 6, 7, 8, 9, 10, 11, 5, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 4, 3, 2, 12, 6, 7, 8, 9, 10, 11, 5, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 4, 3, 2, 7, 6, 12, 8, 9, 10, 11, 5, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 4, 3, 2, 7, 6, 12, 8, 9, 10, 11, 5, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 4, 3, 2, 7, 6, 12, 8, 9, 10, 11, 5, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 4, 3, 2, 7, 6, 12, 8, 9, 10, 11, 5, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 4, 3, 2, 7, 6, 12, 8, 9, 5, 11, 10, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 4, 3, 2, 7, 6, 12, 8, 9, 5, 11, 10, 13, 14, 15, 16, 17, 18, 19]
[0, 1, 4, 3, 2, 7, 6, 12, 8, 9, 5, 11, 10, 13, 14, 15, 16, 17, 18, 19]
>>> print(k)
[0, 1, 4, 3, 2, 7, 6, 12, 8, 9, 5, 11, 10, 13, 14, 15, 16, 17, 18, 19]

【讨论】:

  • 真的,谢谢。我不知道切片运算符会复制列表。
【解决方案2】:

这是因为您创建了lst[:mid]lst[mid:] 原始列表的副本。一种解决方案是将相同的列表和(单独)要处理的范围传递给change()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2020-11-23
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多