Permutations: Difference between revisions
Content added Content deleted
Line 6,262: | Line 6,262: | ||
[3, 2, 1] |
[3, 2, 1] |
||
</pre> |
</pre> |
||
===Single yield iterator=== |
|||
The output order is same as standard Heap's algorithm. |
|||
<lang nim> |
|||
iterator permutations[T](lis: var seq[T]): var seq[T] = |
|||
var |
|||
js = newSeq[int](max(2, lis.len)) |
|||
i = 1 |
|||
while true: |
|||
while js[i] <= i: |
|||
i -= 1 |
|||
js[i] = 0 |
|||
if i == 0: |
|||
⚫ | |||
break |
|||
i += 1 |
|||
if i >= lis.len: break |
|||
let k = if (i and 1) == 0: 0 else: js[i] |
|||
swap lis[i], lis[k] |
|||
js[i] += 1 |
|||
</lang> |
|||
===Translation of C=== |
===Translation of C=== |
||
Line 6,289: | Line 6,268: | ||
iterator permutations[T](ys: openarray[T]): seq[T] = |
iterator permutations[T](ys: openarray[T]): seq[T] = |
||
var |
var |
||
d = |
d = 0 |
||
c = newSeq[int](ys.len) |
c = newSeq[int](max(1, ys.len)) |
||
xs = newSeq[T](ys.len) |
xs = newSeq[T](ys.len) |
||
for i, y in ys: xs[i] = y |
for i, y in ys: xs[i] = y |
||
yield xs |
|||
block outer: |
block outer: |
||
while true: |
while true: |
||
while d > |
while d > 0: |
||
dec d |
dec d |
||
c[d] = 0 |
c[d] = 0 |
||
⚫ | |||
while c[d] >= d: |
while c[d] >= d: |
||
inc d |
inc d |
||
if d >= ys.len: break outer |
if d >= ys.len: break outer |
||
let i = if (d and 1) == 1: c[d] else: 0 |
let i = if (d and 1) == 1: c[d] else: 0 |
||
swap xs[i], xs[d] |
swap xs[i], xs[d] |
||
yield xs |
|||
inc c[d] |
inc c[d] |
||