我需要迭代整数元组的排列。必须通过在每一步交换一对元素来生成订单。
我找到了有关 Heap 算法的 Wikipedia 文章(http://en.wikipedia.org/wiki/Heap%27s_algorithm),它应该可以做到这一点。伪代码是:
procedure generate(n : integer, A : array of any):
if n = 1 then
output(A)
else
for i := 1; i ≤ n; i += 1 do
generate(n - 1, A)
if n is odd then
j ← 1
else
j ← i
swap(A[j], A[n])
我试图在 python 中为此编写一个生成器:
def heap_perm(A):
n = len(A)
Alist = [el for el in A]
for hp in _heap_perm_(n, Alist):
yield hp
def _heap_perm_(n, A):
if n == 1:
yield A
else:
for i in range(1,n+1):
for hp in _heap_perm_(n-1, A):
yield hp
if (n % 2) == 1:
j = 1
else:
j = i
swap = A[j-1]
A[j-1] = A[n-1]
A[n-1] = swap
这会按以下顺序产生排列(对于 [0,1,2,3] 的输入):
0,1,2,3
1,0,2,3
2,0,1,3
0,2,1,3
1,2,0,3
2,1,0,3
3,1,2,0
and so on
这似乎很好,直到最后一步,这不是一对交换。
我究竟做错了什么?