2

当 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...
4

3 回答 3

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)finally 是== 3,这意味着str_a将被打印。
  7. 以此类推,直到CCC
于 2013-09-15T21:42:06.360 回答
1

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

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

也许递归图可以把事情弄清楚(它不完整,因为它很大)递归图(不完整)

于 2013-09-15T21:41:14.607 回答
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, "")
于 2013-09-15T22:02:15.187 回答