鱼C论坛

 找回密码
 立即注册
查看: 2054|回复: 2

[已解决]汉诺塔递归

[复制链接]
发表于 2023-10-7 12:56:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def moveDisk(fp, tp):
    print("moving disk from %d to %d\n" % (fp, tp))
def moveTower(height, fromPole, toPole, withPole):
    if height >= 1:
        moveTower(height-1, fromPole, withPole, toPole)
        moveDisk(fromPole, toPole)
        moveTower(height-1, withPole, toPole, fromPole)
moveTower(3,1,3,2)

这是汉诺塔的一个递推代码,能否解释一下这段代码 的运行逻辑和过程,本人看不懂
最佳答案
2023-10-7 12:57:08
这段代码是一个用递归方法解决汉诺塔问题的实现。以下是代码的运行逻辑和过程的解释:

1. moveDisk(fp, tp) 函数用于输出移动盘子的操作,它接受两个参数 fptp,分别表示源柱和目标柱的编号。此函数仅用于输出移动的信息,并不涉及具体的移动操作。

2. moveTower(height, fromPole, toPole, withPole) 函数是递归的核心部分。它接受四个参数:height 表示当前需要移动的盘子层数,fromPole 表示源柱,toPole 表示目标柱,withPole 表示辅助柱。

3. 如果 height >= 1,即当前层数大于等于 1,那么进入递归的处理过程。

4. 在递归调用之前,先调用 moveTower 函数来将初始柱上的 height-1 层盘子从源柱移动到辅助柱,目标柱作为辅助柱。

5. 然后调用 moveDisk(fromPole, toPole),将最底下一层的盘子从源柱移动到目标柱,通过 moveDisk 函数输出移动的信息。

6. 最后,再次调用 moveTower 函数来将之前移动到辅助柱的 height-1 层盘子从辅助柱移动到目标柱,源柱作为辅助柱。

7. 递归调用会不断地进行,直到 height 的值等于 1,此时会执行最后一次移动操作,并结束递归。

8. 在主程序中,调用 moveTower(3, 1, 3, 2) 来解决三层汉诺塔问题。其中,第一个参数 3 表示汉诺塔的总层数,第二个参数 1 表示初始柱编号,第三个参数 3 表示目标柱编号,第四个参数 2 表示辅助柱编号。

运行这段代码会输出每次移动盘子的信息。它的输出结果是按照汉诺塔问题的规则顺序执行的移动步骤。

希望能解释清楚代码的运行逻辑和过程!如果还有其他疑问,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-7 12:57:08 | 显示全部楼层    本楼为最佳答案   
这段代码是一个用递归方法解决汉诺塔问题的实现。以下是代码的运行逻辑和过程的解释:

1. moveDisk(fp, tp) 函数用于输出移动盘子的操作,它接受两个参数 fptp,分别表示源柱和目标柱的编号。此函数仅用于输出移动的信息,并不涉及具体的移动操作。

2. moveTower(height, fromPole, toPole, withPole) 函数是递归的核心部分。它接受四个参数:height 表示当前需要移动的盘子层数,fromPole 表示源柱,toPole 表示目标柱,withPole 表示辅助柱。

3. 如果 height >= 1,即当前层数大于等于 1,那么进入递归的处理过程。

4. 在递归调用之前,先调用 moveTower 函数来将初始柱上的 height-1 层盘子从源柱移动到辅助柱,目标柱作为辅助柱。

5. 然后调用 moveDisk(fromPole, toPole),将最底下一层的盘子从源柱移动到目标柱,通过 moveDisk 函数输出移动的信息。

6. 最后,再次调用 moveTower 函数来将之前移动到辅助柱的 height-1 层盘子从辅助柱移动到目标柱,源柱作为辅助柱。

7. 递归调用会不断地进行,直到 height 的值等于 1,此时会执行最后一次移动操作,并结束递归。

8. 在主程序中,调用 moveTower(3, 1, 3, 2) 来解决三层汉诺塔问题。其中,第一个参数 3 表示汉诺塔的总层数,第二个参数 1 表示初始柱编号,第三个参数 3 表示目标柱编号,第四个参数 2 表示辅助柱编号。

运行这段代码会输出每次移动盘子的信息。它的输出结果是按照汉诺塔问题的规则顺序执行的移动步骤。

希望能解释清楚代码的运行逻辑和过程!如果还有其他疑问,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-7 12:57:21 | 显示全部楼层
这段代码是一个经典的汉诺塔问题的递归解法。汉诺塔问题是一个数学问题,需要将一堆盘子从一个柱子移动到另一个柱子,同时遵守以下规则:

1. 每次只能移动一个盘子。
2. 每个盘子必须放在比它大的盘子上。

代码中的函数 moveDisk(fp, tp) 用于打印移动盘子的操作,其中 fp 表示起始柱子编号, tp 表示目标柱子编号。

函数 moveTower(height, fromPole, toPole, withPole) 是汉诺塔问题的递归解决方法。它接受四个参数:

·  height :表示当前需要移动的盘子数量。
·  fromPole :表示起始柱子编号。
·  toPole :表示目标柱子编号。
·  withPole :表示辅助柱子编号。

递归的终止条件是当需要移动的盘子数量为1时,直接调用 moveDisk 函数将盘子从起始柱子移动到目标柱子。

递归的过程如下:

1. 首先,递归调用 moveTower 函数,将 height-1 个盘子从起始柱子移动到辅助柱子,目标柱子作为辅助柱子。
2. 然后,调用 moveDisk 函数将最底下的盘子从起始柱子移动到目标柱子。
3. 最后,再次递归调用 moveTower 函数,将之前移动到辅助柱子的 height-1 个盘子从辅助柱子移动到目标柱子,起始柱子作为辅助柱子。

通过这样的递归过程,最终实现了将所有盘子从起始柱子移动到目标柱子的操作。

在代码的最后一行,调用 moveTower(3,1,3,2) 表示要将3个盘子从柱子1移动到柱子3,柱子2作为辅助柱子。运行代码后,你会看到打印出的移动盘子的操作顺序。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 00:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表