davidmou 发表于 2023-10-7 12:56:06

汉诺塔递归

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)

这是汉诺塔的一个递推代码,能否解释一下这段代码 的运行逻辑和过程,本人看不懂

Mike_python小 发表于 2023-10-7 12:57:08

这段代码是一个用递归方法解决汉诺塔问题的实现。以下是代码的运行逻辑和过程的解释:

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

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 表示辅助柱编号。

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

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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}

isdkz 发表于 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作为辅助柱子。运行代码后,你会看到打印出的移动盘子的操作顺序。
页: [1]
查看完整版本: 汉诺塔递归