📜  河内塔 - Python (1)

📅  最后修改于: 2023-12-03 14:56:03.082000             🧑  作者: Mango

河内塔 - Python

河内塔又称为汉诺塔,是一个经典的递归问题。这个问题可以用来介绍递归的概念。

问题描述

河内塔问题的描述如下:

有三根杆子A、B、C。A杆上有若干碟子,每个碟子的大小不同,大的在下,小的在上。

要求将A杆上的所有碟子移至C杆,每次只能移动一个碟子,且大的不能叠在小的上面。在移动过程中可以利用B杆作为中转,但同样需要遵循“大盘子不能叠在小盘子”的规则。

解题思路

利用递归实现。假设有n个盘子需要从A杆移动到C杆,为了方便,我们把这些盘子编号为1到n,其中1号盘子最小,n号盘子最大。首先,我们需要完成以下三个步骤:

  1. 将1至n-1号盘子从A杆移动到B杆;
  2. 将n号盘子从A杆移动到C杆;
  3. 将1至n-1号盘子从B杆移动到C杆。

易得,上述步骤1和步骤3是相同的问题,可以用递归方式解决。

代码实现

以下是河内塔问题的Python实现,函数hanoi表示将n个盘子从A杆移动到C杆,利用B杆作为中转。

def hanoi(n, A, B, C):
    if n == 1:
        print(f"Move {n} from {A} to {C}.")
        return
    hanoi(n-1, A, C, B)
    print(f"Move {n} from {A} to {C}.")
    hanoi(n-1, B, A, C)
使用示例

以下是使用示例,将3个盘子从A杆移动到C杆:

hanoi(3, 'A', 'B', 'C')

程序将输出以下结果:

Move 1 from A to C.
Move 2 from A to B.
Move 1 from C to B.
Move 3 from A to C.
Move 1 from B to A.
Move 2 from B to C.
Move 1 from A to C.
总结

河内塔问题是递归问题中的经典案例,可以用来介绍递归思想。我们可以用递归的方式来解决这个问题,将大问题化解为小问题,然后将小问题逐步解决。在处理递归问题时,需要注意递归终止条件的设置,避免进入死循环。