Прежде всего, у вас есть a
вместо s
в рекурсии permut
звонок.
return [ e + [l[0]] for e in permut(a, l[1:])] + [l+[s]]
Во-первых, он вычисляет permut(s, l[1:])
, то есть: пытается переставлять s
и часть списка без первого элемента. Он выталкивает первый элемент, пока он есть, тогда рекурсивный вызов возвращает [[s]].
Теперь, идя назад в вызовах, s
будет «добавлена» к каждому элементу рекурсивно созданного списка, то данный l
добавляется, а результаты:
# l == []
return [['a']]
# e == ['a']
# l == [3], l[0] == 3
return [['a'] + [3]] + [[3] + [a]]
# equals [['a', 3], [3, 'a']]
# e == ['a', 3] then [3, 'a']
# l == [2, 3], l[0] == 2
return [['a', 3] + [2], [3, 'a'] + [2]] + \
[[2, 3] + [a]]
# equals [['a', 3, 2], [3, 'a', 2], [2, 3, 'a']]
# e == ['a', 3, 2] then [3, 'a', 2] then [2, 3, 'a']
# l == [1, 2, 3], l[0] == 1
return [['a', 3, 2] + [1], [3, 'a', 2] + [1], [2, 3, 'a'] + [1]] + \
[[1, 2, 3] + ['a']]
# equals [['a', 3, 2, 1], [3, 'a', 2, 1], [2, 3, 'a', 1], [1, 2, 3, 'a']]
Может быть, это не красиво читать, но это своего рода работы. Вы можете видеть, что e
извлекается как единственный элемент списка, возвращенного на предыдущем уровне.
Вы также можете попробовать:
def tee(parm):
print parm
return parm
И переопределять permut
как:
def permut(s,l):
if l == []: return [[s]]
return [ e + [l[0]] for e in tee(permut(s, l[1:]))] + [l+[s]]
Мой вывод:
[['a']]
[['a', 3], [3, 'a']]
[['a', 3, 2], [3, 'a', 2], [2, 3, 'a']]
[['a', 3, 2, 1], [3, 'a', 2, 1], [2, 3, 'a', 1], [1, 2, 3, 'a']]
который охватывает рекурсивные вызовы.
Что такое рекурсивный вызов? – kaspersky
Да, ты прав Тим П. – Oni1
Что ты действительно пытаешься сделать? Это ваш собственный код? Если нет, пытаетесь ли вы исправить что-то не так с этим или просто понять? –