对于递归函数的循环?

时间:2013-09-15 21:27:59

标签: 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 BCA BCB...

3 个答案:

答案 0 :(得分:2)

  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

答案 1 :(得分:1)

它不会继续打印'A',因为在3次递归后,它将形成字符串“AAA”。 然后,行print str_a将被执行,因为条件len(str_a) == n将被验证。

之后,执行将返回到c循环内的被调用函数。 c的值为“A”。在接下来的迭代中,c将获得值“B”,并且将调用perm("ABC", 3, "AAB"),打印“AAB”,依此类推。

也许递归图可以清除事物(它不完整,因为它很大)Recursion graph (incomplete)

答案 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, "")