转移参数顺序混乱-递归函数

时间:2019-04-16 05:29:36

标签: python

在河内塔上工作-尝试了解递归上下文中的转移参数顺序。

我大部分时间都可以跟踪堆栈,但是请查看下面的代码。我不明白为什么在else调用中使用n-1时会打印原始def(fr,to)顺序,但是当使用1时会切换到新的(spare,to)顺序。为什么不以任何一种方式打印(备用)订单?

更一般地说,第一个打印“从P1移至P2”,而第二个打印“从P3移至P2”-为什么?

def printMove(fr, to):
    print('move from ' + str(fr) + ' to ' + str(to))

def Towers(n, fr, to, spare):
    if n == 1:
        printMove(fr, to)
    else:        
        Towers(n-1, spare, to, fr)

print(Towers(3, 'P1', 'P2', 'P3'))
                #fr    #to   #spare




def printMove(fr, to):
    print('move from ' + str(fr) + ' to ' + str(to))

def Towers(n, fr, to, spare):
    if n == 1:
        printMove(fr, to)
    else:
        Towers(1, spare, to, fr)

print(Towers(3, 'P1', 'P2', 'P3'))
                #fr    #to   #spare

我希望两个代码实例都打印“从P3到P2移动”,因为我认为在Towers的其他两个调用中,(备用,到,fr)顺序将代替原始的def顺序,但是在两个关于将1还是n-1用作第一个参数。

1 个答案:

答案 0 :(得分:0)

代码的第一部分将简单地改变方向,直到您获得原始订单为止,这就是为什么您第一次获得move from P1 to P2的原因。

执行第二个示例确实会打印move from P3 to P2。这是因为n != 1然后替换了备用文件,然后spare现在是from,而to保持不变。

这不是河内塔的代码的完整部分。 Towers of Hanoi会在每次磁盘移动时让您打印。

要了解该算法,可能要花一些时间(对我来说是如此),但我会尽力而为:

如何使用第三极作为辅助将n磁盘从第一极移动到第二极?您可以这样看-如果您有解决方案将最后一个(最大)磁盘以外的所有磁盘移动到第三极(按正确顺序),则可以将最后一个磁盘移动到第二极,然后将整个磁盘移动第三杆到第二杆,您就完成了。递归相同的想法,我们可以得到以下代码:

def printMove(fr, to):
    print('move from ' + str(fr) + ' to ' + str(to))

def Towers(n, fr, to, spare):
    if n == 1:
        printMove(fr, to)
    else:
        Towers(n-1, fr, spare, to)
        printMove(fr, to)        
        Towers(n-1, spare, to, fr)

所以,如果您尝试“大声朗读”,那么我们拥有的是这样的:

  1. 使用n-1极将前fr个磁盘从spare移到to
  2. 将最大的磁盘从fr极移到to
  3. 将我们从n-1移到spare的所有原始to磁盘

注意-应用print函数时,您无需使用Towers,它不会返回任何内容,只是按原样打印。