【问题标题】:Tower of Hanoi Call Trace河内塔呼叫追踪
【发布时间】:2012-02-15 20:05:05
【问题描述】:

我正在研究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

我无法理解在此之后如何打印 A -> C。在 n= 0 src= A inm= B dest= C 的调用之后,我知道函数将被返回。那里的活动函数是n = 1 src = A inm = C dest = B。那会发生什么?

请解释一下痕迹

【问题讨论】:

    标签: python function recursion callstack


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      如果你仔细考虑的话,这是完全有道理的。

      • 河内(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 调用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2014-02-18
        • 2011-04-06
        • 2018-05-29
        相关资源
        最近更新 更多