#! /usr/bin/python import sys, new #prepare class lst(list): def swap(self, i, j): self[i], self[j] = self[j], self[i] def reverseFrom(self, at): x = at + (len(self)-at)/2 j = len(self)-1 for i in xrange(at, x): self.swap(i, j) j -= 1 arr, n = lst(), int(sys.argv[1]) for i in xrange(n): arr.append(i+1) #permutation def nextPerm(seq): i = len(seq) - 2 while seq[i] > seq[i+1]: #search 'jump' when next element is lesser i -= 1 #(searching from end, but it isn't matter) if i < 0: break #no jump - permutation lexicographic maximal if i >= 0: j = len(seq) - 1 while seq[i] > seq[j]: #search larger element then el. on our 'jump' j -= 1 seq.swap(i, j) #swap them seq.reverseFrom(i+1) #reverse 'tail' - all elements after earlier 'jump' return True #return true if exist next lexicographic permutation seq.reverseFrom(0) #reverse all sequence becouse it's maximal return False #return false if next permutation is lexicographic minimal #print all permutations do, i = True, 0 while do: sys.stdout.write(str(i) + ')\t' + str(arr) + '\n') #just print i += 1 do = nextPerm(arr) #compute next permutation of sequence and get #boolean - is one the largest? print 'last:\t', arr