当for循环运行时,为什么要打印ABC的所有排列而不是所有'A'?
def perm(l, n, str_a):
if len(str_a) == n:
print str_a
else:
for c in l:
perm(l, n, str_a+c)
perm("ABC", 3, "")
打印:
AAA AAB AAC ABA ABB ABC ACA ACB ACC BAA BAB BAC BBA BBB BBC BCA BCB...
答案 0 :(得分:2)
perm("ABC", 3, "")
时,会执行else
子句(因为len("") != 3
)。perm("ABC", 3, "A")
,perm("ABC", 3, "B")
和perm("ABC", 3, "C")
。让我们看看第一个会发生什么:else
,导致函数调用perm("ABC", 3, "AA")
,perm("ABC", 3, "AB")
和perm("ABC", 3, "AC")
。perm("ABC", 3, "AA")
:调用时,else
再次执行 - > perm("ABC", 3, "AAA")
,perm("ABC", 3, "AAB")
和perm("ABC", 3, "AAC")
。len(str_a)
最终为== 3
,这意味着将打印str_a
。CCC
。答案 1 :(得分:1)
它不会继续打印'A',因为在3次递归后,它将形成字符串“AAA”。
然后,行print str_a
将被执行,因为条件len(str_a) == n
将被验证。
之后,执行将返回到c
循环内的被调用函数。 c
的值为“A”。在接下来的迭代中,c
将获得值“B”,并且将调用perm("ABC", 3, "AAB")
,打印“AAB”,依此类推。
也许递归图可以清除事物(它不完整,因为它很大)
答案 2 :(得分:0)
我不知道你想要做什么,但也许一些调试输出可以帮助你搞清楚。试试这个:
def perm(iter, l, n, str_a):
print "starting iteration {0}: l='{1}', n='{2}', str_a='{3}'".format(
iter, l, n, str_a)
if len(str_a) == n:
print str_a
else:
for c in l:
perm(iter+1, l, n, str_a+c)
perm(1, "ABC", 3, "")