首页 > 解决方案 > 关于尝试打印给定列表的所有排列的问题

问题描述

我只是想找出 python shell 没有给出我期望的以下递归代码的输出的原因是什么:

def permutator(list,track):
    if len(list)==1:
        track.append(list[0])
        print (track)
    else:      
        for n in range(len(list)):
            track.append(list[n])
            return permutator(list[:n]+list[n+1:],track)  

当变量''track''初始化为空列表([])时,我希望此脚本打印给定列表的所有排列;例如,我希望permutator([1,2],[])打印[1,2][2,1]. 但它只打印[1,2]......它真的让我失望,因为我花了很多时间才想到将置换函数视为两个变量而不是一个变量的函数,这样轨道“文件”递归过程(顺序迭代过程),直到到达原始列表的排列。

那么我的错误是什么?它是基本的(所以代码的整个想法是错误的......)或者我只需要做一个小的变化才能让它开始工作?

我真的很想靠自己在这个问题上取得成功,但我已经放弃了,所以每一次帮助都会得到祝福!

标签: python

解决方案


当您return函数结束并且循环的其余部分永远不会执行时。此外,您不想追加到列表,因为这会影响传递给稍后调用的函数的列表 - 而只是传递列表,就像在作为参数追加之后一样。具体在这里,由于您只想打印值,因此无需返回,因此您可以这样做:

def permutator(list,track):
    if len(list)==1:
        track.append(list[0])
        print (track)
    else:      
        for n in range(len(list)):
            permutator(list[:n]+list[n+1:],track + [list[n]])

如果您决定要返回所有排列而不是打印它们,则更改很容易:

def permutator(list,track):
    if len(list)==1:
        return track + [list[0]]
    else:
        perms = []
        for n in range(len(list)):
            perms.append(permutator(list[:n]+list[n+1:],track + [list[n]]))
        return perms

推荐阅读