你的线路perm(s,p+1,ii)
实际上什么也没做:就像打字一样
>>> perm("fred")
<generator object perm at 0xb72b9cd4>
但是,如果您从该调用中屈服,即
for subperm in perm(s, p+1, ii):
yield subperm
然后你会得到
>>> list(perm("abc"))
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
>>> list(perm("abcd"))
['abcd', 'abdc', 'acbd', 'acdb', 'adbc', 'adcb', 'bacd', 'badc', 'bcad', 'bcda', 'bdac', 'bdca', 'cabd', 'cadb', 'cbad', 'cbda', 'cdab', 'cdba', 'dabc', 'dacb', 'dbac', 'dbca', 'dcab', 'dcba']
>>> len(_)
24
>>> len(set(perm("abcd")))
24
看起来不错。除此之外我还没有测试过代码。
顺便说一句,你可以交换s[i]
and s[p]
with s[i], s[p] = s[p], s[i]
;不需要tmp
多变的。
PS:现在你不处理单字符的情况。