Permutations by swapping: Difference between revisions

→‎{{header|Python}}: generalize it to a permutation of an arbitrary list, rather than just a range of numbers
(→‎{{header|Python}}: generalize it to a permutation of an arbitrary list, rather than just a range of numbers)
Line 216:
DEBUG = False # like the built-in __debug__
 
def spermutations(nseq):
"""permutations by swapping. Yields: perm, sign"""
sign = 1
p = [[ix, 0 if i == 0 else -1] # [numelem, direction]
for i, x in rangeenumerate(nseq)]
 
if DEBUG: print ' #', p
Line 265:
print '\nPermutations and sign of %i items' % n
sp = set()
for i in spermutations(range(n)):
sp.add(i[0])
print('Perm: %r Sign: %2i' % i)
Line 309:
===Python: recursive===
After spotting the pattern of highest number being inserted into each perm of lower numbers from right to left, then left to right, I developed this recursive function:
<lang python>def s_permutations(nseq):
def s_perm(itemsseq):
if itemsnot <= 0seq:
return [[]]
else:
new_items = []
for i, item in enumerate(s_perm(items seq[:- 1])):
if i % 2:
# step down
new_items += [item[:i] + seq[items - 1:] + item[i:]
for i in range(len(item), -1, -1)]
else:
# step up
new_items += [item[:i] + seq[items - 1:] + item[i:]
for i in range(len(item) + 1)]
return new_items
 
return [(tuple(item), -1 if i % 2 else 1)
for i, item in enumerate(s_perm(nseq))]</lang>
 
;Sample output:
Line 334:
===Python: Iterative version of the recursive===
Replacing the recursion in the example above produces this iterative version function:
<lang python>def s_permutations(nseq):
items = [[]]
for j in range(n)seq:
new_items = []
for i, item in enumerate(items):
Anonymous user