递归列表构建:所有长度的排列

时间:2015-01-25 13:04:07

标签: python recursion

我在递归方面遇到了一些麻烦,特别是对于列表。我不理解递归建立列表的过程'很好,因为我没有真正得到列表的创建地点。我已经让这个程序打印出len(string)的所有排列,但我想扩展它,以便它也给我{1}}的长度为1的排列。这是我得到的:

len(string) - 1

给出了:

def subset(string):
    result = []

    if len(string) == 0:
        result.append(string)
        return result
    else:
        for i in range(len(string)):
            shorterstring = string[ :i] + string[i+1: ]

            shortersets = subset(shorterstring)

            for s in shortersets:
                result.append(string[i] + s)
    return result

我不明白为什么当我将print(subset("rum")) ['rum', 'rmu', 'urm', 'umr', 'mru', 'mur'] 改为result.append(string[i] + s)时,我根本没有输出。

1 个答案:

答案 0 :(得分:0)

如果您将result.append(string[i] + s)更改为result.append(s),则代码只会在len(string)时向results添加len(string) == 0长度的排列。

要使代码生成所有排列,最后一个for循环必须是:

for s in shortersets:
    result.append(string[i] + s)
    result.append(s) 

请注意,当与原始代码一起使用时,实际上最终会将相同排列的多个实例添加到最终输出中。您可以通过results set而不是list来解决此问题,但您可能需要尝试重新编写代码以完全避免这种低效率。