【问题标题】:Python permutations recursivePython排列递归
【发布时间】:2016-06-19 07:19:45
【问题描述】:

我正在尝试使用回溯解决问题,我需要数字的排列。我有这个基本算法,但问题是......结果不是按正常顺序出现的。

def perm(a,k=0):
   if(k==len(a)):
      print(a)
   else:
      for i in range(k,len(a)):
         a[k],a[i] = a[i],a[k]
         perm(a, k+1)
         a[k],a[i] = a[i],a[k]

示例:对于 [1,2,3],正常结果是:[1,2,3] [1,3,2] [2,1,3] [2,3,1] [3, 1,2] [3,2,1]

而该算法将交换最后两个元素。我明白为什么。我只是不知道如何纠正这个问题。

我不想使用来自 itertools 的排列。上面的代码可以很容易地修复以正常工作吗?从上面看这个算法的复杂度是多少?

【问题讨论】:

标签: python algorithm recursion permutation backtracking


【解决方案1】:

这是一个(次优,因为一直在复制列表)解决方案:

def perm(a, prev=[]):
    if not a:
        print(prev)
    for index, element in enumerate(a):
        perm(a[:index] + a[index+1:], prev + [element])

‌打印出来的顺序:

>>> perm([1,2,3])
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]

【讨论】:

    【解决方案2】:

    一个递归生成器函数,它产生与原始列表相关的预期顺序的排列:

    def perm(a):
        if len(a) <= 1:
            yield a
        else:
            for i in xrange(len(a)):
                for p in perm(a[:i]+a[i+1:]):
                    yield [a[i]]+p
    
    a = [1, 2, 3]
    
    for p in perm(a):
        print(p)
    
    [1, 2, 3]
    [1, 3, 2]
    [2, 1, 3]
    [2, 3, 1]
    [3, 1, 2]
    [3, 2, 1]
    

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2011-07-23
      • 1970-01-01
      • 2013-06-13
      相关资源
      最近更新 更多