Python中字符串的所有排列(递归)

Python中字符串的所有排列(递归),python,recursion,permutation,Python,Recursion,Permutation,这次我需要一记重拳。我定义了以下递归函数: def perms(s): if(len(s)==1): return s res = '' for x in xrange(len(s)): res += s[x] + perms(s[0:x] + s[x+1:len(s)]) return res + '\n' perms(“abc”)目前返回: abccb bacca cabba 期望的结果是 abc acd bac bca cab cba 我在这里哪

这次我需要一记重拳。我定义了以下递归函数:

def perms(s):
  if(len(s)==1):
    return s

  res = ''
  for x in xrange(len(s)):

    res += s[x] + perms(s[0:x] + s[x+1:len(s)])

  return res + '\n'
perms(“abc”)目前返回:

abccb
bacca
cabba
期望的结果是

abc
acd
bac
bca
cab
cba
我在这里哪里出了问题?我如何以不同的方式思考问题,从而提出解决方案?

注意:我知道itertools功能。我试图了解如何递归地实现排列,以供自己学习。这就是为什么我希望有人指出我的代码有什么问题,以及如何以不同的方式解决问题。谢谢

就这样(递归排列):

def Permute(string):
    if len(string) == 0:
        return ['']
    prevList = Permute(string[1:len(string)])
    nextList = []
    for i in range(0,len(prevList)):
        for j in range(0,len(string)):
            newString = prevList[i][0:j]+string[0]+prevList[i][j:len(string)-1]
            if newString not in nextList:
                nextList.append(newString)
    return nextList
为了获得所有置换字符串的列表,只需使用输入字符串调用上面的函数。比如说,

stringList = Permute('abc')
string = '\n'.join(Permute('abc'))
要获得由新行字符分隔的所有置换字符串的单个字符串,只需调用
“\n”。将该函数的输出连接到
。比如说,

stringList = Permute('abc')
string = '\n'.join(Permute('abc'))

顺便说一句,上面两个选项的打印结果是相同的。

这种东西对于生成器()来说是一个不错的地方,
产生了

尝试以下方法(未经测试):

def permute_字符串:

如果len(s)不确定效率,但这也应该有效

def find_permutations(v):
    if len(v) > 1:
        for i in perms(v):
            nv = i[1:]
            for j in perms(nv):
                print(i[0] + j)
    else:
        print(v)


def perms(v):
    if not hasattr(perms, 'original'):
        perms.original = v
        perms.list = []
    nv = v[1:] + v[0]
    perms.list.append(nv)
    if perms.original == nv:
        l = perms.list
        del perms.original
        del perms.list
        return l
    return perms(nv)

find_permutations('abc')

排列的结果将是一个集合,比如说一个列表。如果您这样想,它将使您的代码更干净,如果需要,您可以将结果合并到单个字符串中。下面是一个简单的例子

def perms(s):        
    if(len(s)==1): return [s]
    result=[]
    for i,v in enumerate(s):
        result += [v+p for p in perms(s[:i]+s[i+1:])]
    return result


perms('abc')

['abc', 'acb', 'bac', 'bca', 'cab', 'cba']


print('\n'.join(perms('abc')))

abc
acb
bac
bca
cab
cba
代码如下:

def fperms(elements):
    if len(elements)<=1:
        yield elements
    else:
        for p in fperms(elements[1:]):
            for i in range(len(elements)):
                yield p[:i]+elements[0:1]+p[i:]
def fperms(元素):

如果len(elements)您考虑过使用
itertools.permutations
?该函数是递归和迭代的。我想您只需要在
s[0]
上预先设置
s[1://code>上的递归,而不使用循环。@squiguy:我想gnp210是在学习东西。最好的学习方法就是去做。我想返回一个字符串,而不是一个列表。你能看到我的代码哪里出错了吗?@gnp210:哦,好的,我明白了。然后您只需调用
'\n'.join(Permute('abc'))
。我将把它添加到答案中。假设我有str='h'。prevList返回[]。下一个列表返回[]。两者的长度均为0。因此,置换集返回[]。关于这个答案的元讨论:@user000001:非常感谢您指出这一点。那个用户不仅对我的答案发表了这个错误的评论(见上面的评论帖子),而且还在这个论坛上发布了那个错误的评论,为他的行为辩解。我会确保添加这个评论线程也有。再次感谢:)一旦s的大小达到1,这个函数将在for循环中给出一个越界异常列表。我试着将for循环放在else语句中,但函数只返回“abc”。错误在于(a)函数在产生唯一结果后仍试图继续运行,(b)当我指
谢谢@karakfa时,我使用了
<1
,这是我在python中见过的最干净、最容易理解的递归置换实现!