25 lines
562 B
Plaintext
25 lines
562 B
Plaintext
next_permutation(v) := block([n, i, j, k, t],
|
|
n: length(v), i: 0,
|
|
for k: n - 1 thru 1 step -1 do (if v[k] < v[k + 1] then (i: k, return())),
|
|
j: i + 1, k: n,
|
|
while j < k do (t: v[j], v[j]: v[k], v[k]: t, j: j + 1, k: k - 1),
|
|
if i = 0 then return(false),
|
|
j: i + 1,
|
|
while v[j] < v[i] do j: j + 1,
|
|
t: v[j], v[j]: v[i], v[i]: t,
|
|
true
|
|
)$
|
|
|
|
print_perm(n) := block([v: makelist(i, i, 1, n)],
|
|
disp(v),
|
|
while next_permutation(v) do disp(v)
|
|
)$
|
|
|
|
print_perm(3);
|
|
/* [1, 2, 3]
|
|
[1, 3, 2]
|
|
[2, 1, 3]
|
|
[2, 3, 1]
|
|
[3, 1, 2]
|
|
[3, 2, 1] */
|