在python中使用递归函数生成

bib*_*esh 1 python recursion yield generator

我正在尝试为排列目的创建一个生成器.我知道在python中有其他方法可以做到这一点.但这是为了其他的东西.但我无法屈服于这些价值观.你可以帮忙吗?

def perm(s,p=0,ii=0):
    l=len(s)
    s=list(s)
    if(l==1):       
        print ''.join(s)
    elif((l-p)==2):
        yield ''.join(s)
        yield ''.join([''.join(s[:-2]),s[-1],s[-2]])
    else:
        for i in range(p,l):
            tmp=s[p]
            s[p]=s[i]
            s[i]=tmp        
            perm(s,p+1,ii)
Run Code Online (Sandbox Code Playgroud)

DSM*_*DSM 5

你的生产线perm(s,p+1,ii)没有做任何事,真的:就像打字一样

>>> perm("fred")
<generator object perm at 0xb72b9cd4>
Run Code Online (Sandbox Code Playgroud)

但是,如果你从那个电话中产生,即

        for subperm in perm(s, p+1, ii):
            yield subperm
Run Code Online (Sandbox Code Playgroud)

然后你会得到

>>> 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
Run Code Online (Sandbox Code Playgroud)

看起来还不错.我还没有测试过代码.

顺便说一句,你可以交换s[i]s[p]使用s[i], s[p] = s[p], s[i]; 不需要tmp变量.

PS:现在你不处理单字符的情况.

  • OP正在使用Python 2判断来自`print`语句,但仍在发布候选Python 3的`perm(s,p + 1,ii)'的收益也会这样做.:) (4认同)