在河内塔上工作-尝试了解递归上下文中的转移参数顺序。
我大部分时间都可以跟踪堆栈,但是请查看下面的代码。我不明白为什么在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用作第一个参数。
答案 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)
所以,如果您尝试“大声朗读”,那么我们拥有的是这样的:
n-1
极将前fr
个磁盘从spare
移到to
fr
极移到to
极n-1
移到spare
的所有原始to
磁盘 注意-应用print
函数时,您无需使用Towers
,它不会返回任何内容,只是按原样打印。