河内塔递归调用

Towers of Hanoi recursive calls

1
2   def printMove (to, fr):
3       '''Prints the moves to be executed'''
4       print 'move from ' + str (fr) + ' to ' + str (to)
5   
6   def towers (n, fr, to, sp):
7       if n == 1:            
8     
9       printMove (to, fr)    # 
10      
11      else:
12          towers (n-1, fr, sp, to)  
13                    
14                   
15                 
16          towers (1, fr, to, sp)
17          towers (n - 1, sp, to, fr)
18  
19  towers (3, 'fr', 'to', 'sp')

谁能解释一下为什么这段代码在第 12 行完成递归调用 n 递减到 1,然后再次调用 n = 2 然后移动到第 16 行?我一直在使用 python tutor 并试图理解每个步骤以及算法有效的原因。

首先,题外话:您显示的代码在第 9 行包含一个错误,缩进不合法。

执行从第 19 行开始,它调用 towers(3,...),继续到第 12 行,调用 towers(2,...),继续到第 12 行,在那里它调用 towers(1,...),它会打印一些内容和 returns。当它 returns 时,执行在 towers(2,...) 调用中恢复,并在第 16 行恢复,正如您观察到的那样。

首先,您的代码并不完全正确。这是为您更改的 towers 函数 ->

def towers (n, fr, to, sp):
    if n == 1:            
        printMove (to, fr)
    else:
        towers (n-1, fr, sp, to)
        printMove (to,fr)
        towers (n-1, sp, to, fr)

下面是解释。看图->

通过调用 Movetower(3,a,b,c),您打算将所有 3 个圆盘从塔 A 移动到塔 B。所以顺序调用是 ->

1. Movetower(3,a,b,c)  // No Move needed
2. Movetower(2,a,c,b)  // No move needed
3. Movetower(1,a,b,c)  // Here is the time to move, move disc1 from a to b
4. Movetower(2,a,c,b)  // Returning to this call again, this is the time to move disc2 from a to c
5. Movetower(1,b,c,a)  // Again the time to move, this time disc1 from b to c
6. Movetower(3,a,b,c)  // Returning to this call again, this is the time to move disc3 from a to b
7. Movetower(2,c,b,a)  // Not the time to move
8. Movetower(1,c,a,b)  // Here is the time to move, move disc1 from c to a
9. Movetower(2,c,b,a)  // Returning to this call again, this is the time to move disc2 from c to b
10.Movetower(1,c,a,b)  // Here is the time to move, move disc1 from a to b

希望对您有所帮助:)

您还可以在这里找到一些很好的解释:Tower of Hanoi: Recursive Algorithm

对于动画:https://www.cs.cmu.edu/~cburch/survey/recurse/hanoiex.html