Перестановки в ваших результатах отличаются от предыдущего элемента заменой двух элементов.
Замена двух элементов соответствует ребру в пермутоэдре.
Это говорит о том, что вы пытаетесь посетитьвершины в пермутоэдре по некоторым критериям.Можете ли вы объяснить, что такое критерии в геометрических терминах?
Например, один из возможных вопросов - как генерировать все возможные перестановки, меняя местами только два элемента на каждом ходу.Это соответствует нахождению гамильтонова пути на пермутоэдре.Ответ на этот вопрос дает алгоритм Штейнхауса-Джонсона-Троттера , который дает метод O (n) для нахождения следующей перестановки из заданной позиции.
EDIT
Вот пример кода Python для обновленного вопроса:
def perms(A):
if len(A)==1:
yield A
for i in xrange(len(A)-1,-1,-1):
for B in perms(A[:i]+A[i+1:]):
yield B+A[i:i+1]
Запуск
for a in perms([1,2,3,4]):
print a
выводит следующее:
[1, 2, 3, 4]
[2, 1, 3, 4]
[1, 3, 2, 4]
[3, 1, 2, 4]
[2, 3, 1, 4]
[3, 2, 1, 4]
[1, 2, 4, 3]
[2, 1, 4, 3]
[1, 4, 2, 3]
[4, 1, 2, 3]
[2, 4, 1, 3]
[4, 2, 1, 3]
[1, 3, 4, 2]
[3, 1, 4, 2]
[1, 4, 3, 2]
[4, 1, 3, 2]
[3, 4, 1, 2]
[4, 3, 1, 2]
[2, 3, 4, 1]
[3, 2, 4, 1]
[2, 4, 3, 1]
[4, 2, 3, 1]
[3, 4, 2, 1]
[4, 3, 2, 1]