Python 递归函数中的For循环?
当for循环运行时,为什么它打印ABC的所有排列而不是所有的APython 递归函数中的For循环?,python,for-loop,recursion,Python,For Loop,Recursion,当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 BC
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...
它不会一直打印“A”,因为在3次递归之后,它将形成字符串“AAA”。 然后,将执行行
print stru_a
,因为将验证条件len(str_a)==n
之后,执行将返回被调用函数,该函数位于c
循环中<代码>c的值为“A”。在接下来的迭代中,c
将获得值“B”,并调用perm(“ABC”,3,“AAB”)
,打印“AAB”,以此类推
也许递归图可以把事情弄清楚(它不完整,因为它很大)
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(stru a)
最后是==3
,这意味着将打印stru a
CCC
我不知道你想做什么,但也许一点调试输出可以帮助你解决这个问题。试试这个:
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, "")
你能发布你的预期输出吗?哇。。。下次请再清楚一点。我花了5分钟才明白你的要求。你有一个有效的代码,但你不明白为什么。下次请把这一点说清楚。很抱歉你发现我的问题模棱两可。我已按要求更新了输出。这确实为我澄清了这一点。我现在明白了排列是如何产生的。非常感谢。非常感谢你的帮助,这个图表非常有用。以后我会尽量把我的问题弄清楚。