整数のタプルの順列を繰り返す必要があります。順序は、各ステップで要素のペアを交換して生成する必要があります。
これを行うはずの Heap のアルゴリズムに関するウィキペディアの記事 ( 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
これは、1 ペアの交換ではない最後のステップまで問題ないようです。
私は何を間違っていますか?