我是 Python 的新手,目前正在学习有关汉诺塔和递归的教程。在他们给出这个例子之前,我认为我理解递归:
def moveTower(height,fromPole, toPole, withPole):
if height >= 1:
moveTower(height-1,fromPole,withPole,toPole)
moveDisk(fromPole,toPole)
moveTower(height-1,withPole,toPole,fromPole)
#print(withPole)
def moveDisk(fp,tp):
print("moving disk from",fp,"to",tp)
moveTower(3,"A","B","C")
它打印出用 3 个圆盘解决汉诺塔问题的正确步骤:
将磁盘从 A 移动到 B
将磁盘从 A 移动到 C
将磁盘从 B 移动到 C
将磁盘从 A 移动到 B
将磁盘从 C 移动到 A
将磁盘从 C 移动到 B
将磁盘从 A 移动到 B
我的问题是,它是怎么做到的?!有人可以检查代码行以便我了解它如何打印正确的 Action 吗?我主要对 fp
和 tp
的值如何从 A
到 B
到 C
。对不起,如果这是一个广泛的问题!任何帮助将不胜感激!
在这个简单的例子中,您可以通过使用适当的 print
来想象发生了什么,就像这样:
def moveTower(height,fromPole, toPole, withPole):
if height >= 1:
print( " "*(3-height), "moveTower:", height, fromPole, toPole )
moveTower(height-1,fromPole,withPole,toPole)
moveDisk(fromPole,toPole,height)
moveTower(height-1,withPole,toPole,fromPole)
#print(withPole)
def moveDisk(fp,tp,height):
print(" "*(4-height), "moving disk", "~"*(height), "from",fp,"to",tp)
moveTower(3,"A","B","C")
输出是:
moveTower: 3 A B
moveTower: 2 A C
moveTower: 1 A B
moving disk ~ from A to B
moving disk ~~ from A to C
moveTower: 1 B C
moving disk ~ from B to C
moving disk ~~~ from A to B
moveTower: 2 C B
moveTower: 1 C A
moving disk ~ from C to A
moving disk ~~ from C to B
moveTower: 1 A B
moving disk ~ from A to B