簡體   English   中英

在遞歸函數中進行循環?

[英]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...
  1. 當您調用perm("ABC", 3, "") ,執行else子句(因為len("") != 3 )。
  2. 這導致調用perm("ABC", 3, "A")perm("ABC", 3, "B")perm("ABC", 3, "C") 讓我們看看第一個發生了什么:
  3. 同樣,執行else ,導致函數調用perm("ABC", 3, "AA")perm("ABC", 3, "AB")perm("ABC", 3, "AC")
  4. 步驟2中的其他函數調用也會發生相同的事情(您知道了)。
  5. 讓我們看一下perm("ABC", 3, "AA") :被調用時, else將再次執行-> perm("ABC", 3, "AAA")perm("ABC", 3, "AAB")perm("ABC", 3, "AAC")
  6. 在這些調用中,表達式len(str_a)最后是== 3 ,這意味着將打印str_a
  7. 依此類推,直到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM