[英]For loop in recursive function?
當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...
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
為止。 它不會一直打印'A',因為經過3次遞歸后,它將形成字符串“ AAA”。 然后,將執行行print str_a
,因為將驗證條件len(str_a) == n
。
之后,執行將返回到c
循環內的被調用函數。 c
值為“ A”。 在下面的迭代中, c
將獲得值“ B”,並且將調用perm("ABC", 3, "AAB")
,並打印“ AAB”,依此類推。
也許遞歸圖可以解決問題(它不完整,因為它很大)
我不知道您要做什么,但是也許一點點調試輸出會幫助您弄清楚。 嘗試這個:
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, "")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.