河内塔呼叫追踪

时间:2012-01-21 18:00:16

标签: python function recursion callstack

我正在研究python中的河内递归实现塔。在我的文章中,我给出了不同点的印刷品,以便更好地了解

def hanoi(n, src, inm, dest):
    print "n=",n,"src=",src,"inm=",inm,"dest=",dest
    if n == 0:
        return
    hanoi(n-1, src, dest, inm)
    print src, '->', dest
    print n 
    hanoi(n-1, inm, src, dest)

hanoi(2,'A','B','C')

答案如下:

n= 2 src= A inm= B dest= C
n= 1 src= A inm= C dest= B
n= 0 src= A inm= B dest= C
A -> B
1
n= 0 src= C inm= A dest= B
A -> C
2
n= 1 src= B inm= A dest= C
n= 0 src= B inm= C dest= A
B -> C
1
n= 0 src= A inm= B dest= C

我能理解到

   1
    n= 0 src= C inm= A dest= B

我无法理解A - >此后打印C.在调用n = 0 src = A inm = B dest = C之后,我知道将返回函数。有效功能是n = 1 src = A inm = C dest = B.那会怎么样?

请解释跟踪

2 个答案:

答案 0 :(得分:1)

如果你仔细想想,这是完全合理的。

  • 河内(2,A,B,C)
    • 河内(1,A,C,B)
      • hanoi(0,A,B,C)立即返回
      • A - > B,n = 1
      • hanoi(0,C,A,B)立即返回。
    • A - > C,n = 2
    • 河内(1,B,A,C)

等等。换句话说,您感到困惑的是在最外层函数中进行的第二次hanoi调用。

答案 1 :(得分:1)

如果再添加两张照片:

print "r1"   # before first return
print "r2"   # at the end of the function, before second, implicit return

然后你会看到连续有两个回报:

n= 2 src= A inm= B dest= C
n= 1 src= A inm= C dest= B
n= 0 src= A inm= B dest= C
r1
A -> B
1
n= 0 src= C inm= A dest= B
r1
r2
A -> C
2
n= 1 src= B inm= A dest= C
n= 0 src= B inm= C dest= A
r1
B -> C
1
n= 0 src= A inm= B dest= C
r1
r2
r2