2012-01-21 90 views
1

我正在學習python河內遞歸實現塔。在我prgram我給在不同的點打印多知道一點像河內電話塔追蹤

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 

我不可能理解一個 - > C後打印。在調用n = 0之後src = A inm = B dest = C之後,我知道函數會被返回。那裏的活動函數是n = 1 src = A inm = C dest = B。會發生什麼?

請解釋跟蹤

回答

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 
1

如果您仔細考慮,這是非常有意義的。

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

等等。換句話說,你感到困惑的是第二個hanoi調用在最外層的函數。