Я хочу систематически генерировать перестановки алфавита. Я не могу не использовать python itertools.permutation, потому что предварительное создание списка каждой перестановки приводит к сбою моего компьютера (в первый раз, когда я действительно заставил его принудительно завершить работу, это было довольно здорово).
Поэтому мой новый подход заключается в генерации и тестировании каждого ключа на лету. В настоящее время я пытаюсь справиться с этим с помощью рекурсии.
Моя идея состоит в том, чтобы начать с самого большого списка (в качестве примера я буду использовать список из 3 элементов), рекурсивно переходить к меньшему списку, пока список не будет состоять из двух элементов. Затем он распечатает список, поменяет местами последние два, снова распечатает список, вернется на один уровень вверх и повторит.
Например, для 123
123 (поменять местами позицию 0 с позицией 0)
23 --> 123 (swap position 1 with position 1) 32 --> 132 (swap position 1 with position 2)
213 (поменять местами позицию 0 с позицией 1)
13 --> 213 (swap position 1 with position 1) 31 --> 231 (swap position 1 with position 2)
321 (поменять местами позицию 0 на позицию 2)
21 --> 321 (swap position 1 with position 1) 12 --> 312 (swap position 1 with position 2)
для четырехбуквенного номера (1234)
1234 (поменять местами позицию 0 на позицию 0)
234 (swap position 1 with position 1) 34 --> 1234 43 --> 1243 324 (swap position 1 with position 2) 24 --> 1324 42 --> 1342 432 (swap position 1 with position 3) 32 --> 1432 23 --> 1423
2134 (поменять местами позицию 0 на позицию 1) 134 (поменять местами позицию 1 на позицию 1) 34 --> 2134 43 --> 2143 314 (поменять местами позицию 1 на позицию 2) 14 --> 2314 41 --> 2341 431 (поменять местами позиция 1 с позицией 3) 31 --> 2431 13 --> 2413
Это код, который у меня сейчас есть для рекурсии, но он причиняет мне много горя, рекурсия не моя сильная сторона. Вот что у меня есть.
def perm(x, y, key):
print "Perm called: X=",x,", Y=",y,", key=",key
while (x<y):
print "\tLooping Inward"
print "\t", x," ",y," ", key
x=x+1
key=perm(x, y, key)
swap(x,y,key)
print "\tAfter 'swap':",x," ",y," ", key, "\n"
print "\nFull Depth Reached"
#print key, " SWAPPED:? ",swap(x,y,key)
print swap(x, y, key)
print " X=",x,", Y=",y,", key=",key
return key
def swap(x, y, key):
v=key[x]
key[x]=key[y]
key[y]=v
return key
Любая помощь будет принята с благодарностью, это действительно классный проект, и я не хочу отказываться от него.
Спасибо всем! Комментарии к моему методу или чему-то еще приветствуются.
itertools.permutations
не создает заранее все перестановки, и, насколько я могу судить, это именно то, что вам нужно. Возможно, вы пытались сделать что-то вроде печати всех его результатов или вставить их в список, из-за чего ему пришлось генерировать их все, чтобы удовлетворить запрос? - person dfan   schedule 09.04.2011