Python排列递归

时间:2016-03-05 13:52:29

标签: 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的排列。上面的代码可以轻松修复以正常工作吗?从上面算法的复杂性是什么?

2 个答案:

答案 0 :(得分:2)

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

viewDidLoad

答案 1 :(得分:1)

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

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

打印出来的顺序:

 <input id="amount1"  placeholder="Amount1" type="number" onfocus="this.placeholder = '';"  onblur="this.placeholder='Amount1'" oninput="update()"/>
<input id="amount2"  placeholder="Amount2"type="number"  onfocus="this.placeholder = '';"  onblur="this.placeholder='Amount2'"oninput="update()"/>
<input id="amount3"  placeholder="Amount3" type="number" onfocus="this.placeholder = '';"  onblur="this.placeholder='Amount3'" oninput="update()"/>