Python排列递归

标签 python algorithm recursion permutation backtracking

我正在尝试使用回溯法解决问题,我需要它的数字排列。我有执行此操作的基本算法,但问题是……结果不按正常顺序出现。

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]

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

我不想使用 itertools 的排列组合。上面的代码可以轻松修复以正常工作吗?从上面看,这个算法的复杂度是多少?

最佳答案

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

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]

关于Python排列递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35814976/

相关文章:

recursion - 如何定义我自己的(递归)Coq 符号?

python - 在 NetworkX 中显示节点位于精确 (x,y) 位置的图形。结果被轮换

python - Python 中查询的执行时间差异

algorithm - 扩展欧几里德算法的位复杂度是多少?

algorithm - n 个不同元素的二叉搜索树的数量

c - 关于 C 中局部静态变量的不同行为的问题

python - 在 OSX 上调用 python 和 Spyder 的方法

python - 如何通过requirements.txt安装.zip包?

algorithm - 在具有多维前置数组的图中查找两个节点之间的所有最短路径

recursion - 方案中的迭代图