首先,你有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']]
其中包括递归调用。