我需要为应用程序生成字谜。我使用以下代码生成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)
有人能告诉我哪里出错了吗?我需要一个字符串的独特字谜
答案 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亿结果。
请注意,大部分输出都是重复的。如果您打算不打印重复项,那么结果的数量要小得多。