我的递归生成字符串所有排列的解决方案如何工作?

时间:2018-11-20 01:11:43

标签: python recursion permutation

def permutationString(word):
    print('word', word)
    result = []

    if len(word) == 0:
        result.append('')
        return result

    for i in range(len(word)):
        before = word[0 : i]
        after = word[i + 1 :]
        print('before',before)
        print('after', after)
        partials = permutationString(before + after)
        print(partials)
        for s in partials:
            result.append(word[i] + s)

    return result

这是我为给定字符串生成排列的解决方案。

对于输入abc,它给了我['abc', 'acb', 'bac', 'bca', 'cab', 'cba'],这似乎是正确的。

我的问题是,我不太了解魔术的工作原理。代码本身非常直观。我们只是尝试将每个字符作为第一个字符,然后附加排列。

但是我真的不知道如何生成partials,并且不确定result.append('')为空时不执行word时解决方案如何工作。

对魔术的运作方式是否有直观的解释?

1 个答案:

答案 0 :(得分:1)

我有一个full lengthy answer here

简短的答案是,只有一种方法可以编写不包含元素的序列。那是空序列。因此,包含所有.Value排列的列表为''

假设您弄错了,然后返回[''],即没有解决方案。那会发生什么呢?

好吧,正如您所说的,在归纳法中,您尝试将每个元素作为第一个元素,然后将其放在没有该元素的置换解决方案的前面。因此,考虑一个只有一个元素[]的序列。您将把'x'放在所有x解决方案的前面。如果''的排列返回了'',那是一个没有解决方案的空列表,那么您将没有解决方案将[]放在前面。不过它会返回x,因此您将['']放在该解决方案'x'的前面。

奖金

一旦您知道了它,您可能想尝试另一种类似的算法来计算排列。

尝试在每个递归步骤中仅选择第一个元素''来构建word的所有排列,然后以某种方式将其与word[0]排列的解决方案“结合”。