字谜代码导致无限结果

时间:2015-09-24 05:35:52

标签: python algorithm recursion

我需要为应用程序生成字谜。我使用以下代码生成anagrams

def anagrams(s):
    if len(s) < 2:
        return s
    else:
        tmp = []
        for i, letter in enumerate(s):
            for j in anagrams(s[:i]+s[i+1:]):
                tmp.append(j+letter)
                print (j+letter)
    return tmp

上面的代码一般都适用。但是,当传递以下字符串时,它会打印无限结果

str = "zzzzzzziizzzz"
print anagrams(str)

有人能告诉我哪里出错了吗?我需要一个字符串的独特字谜

3 个答案:

答案 0 :(得分:4)

这不是无穷无尽的结果,这是13!(*)字(有点超过6亿);你正面临着组合爆炸。

(*)13 factorial。

答案 1 :(得分:1)

其他人指出你的代码产生了13个!字谜,其中许多都是重复的。然而,你的11个z和2个i的字符串只有78个独特的字谜。 (那是13!/(11!·2!)或13·12/2。)

如果您只想要这些字符串,请确保您不会多次递归同一个字母:

def anagrams(s):
    if len(s) < 2:
        return s
    else:
        tmp = []
        for i, letter in enumerate(s):
            if not letter in s[:i]:
                for j in anagrams(s[:i] + s[i+1:]):
                    tmp.append(letter + j )
        return tmp

额外的测试可能不是判断字母是否已被使用的最有效方法,但在你的情况下,有许多重复的字母,它将节省大量的递归。

答案 2 :(得分:0)

没有infinte结果 - 只有13个!或6,227,020,800

你只是没有等待足够的60亿结果。

请注意,大部分输出都是重复的。如果您打算不打印重复项,那么结果的数量要小得多。