汉诺塔的 Python 实现与算法解析

给定一定数量的圆盘 n,我们的任务是将所有圆盘从源柱移动到目标柱,且必须遵循以下规则:

  • 一次只能移动一个圆盘。
  • 较大的圆盘不能放置在较小的圆盘之上。
  • 只能移动任意柱顶端的圆盘。

汉诺塔谜题通过将一个大问题分解为更小的步骤来生动地展示递归思想。下面的图解展示了圆盘如何在柱子之间一步步移动:

让我们来探索解决这个问题的不同方法。

使用迭代法

在这种方法中,我们利用位运算和栈逻辑迭代地解决这个谜题。它摒弃了递归调用,而是基于圆盘的数量利用移动的规律模式。对于较大的 n 值,这种方法更为高效,因为它避免了深度递归调用。

Python


CODEBLOCK_4c1551f9

Output

> Move disk 1 from A to B

> Move disk 2 from A to C

> Move disk 1 from B to C

> Move disk 3 from A to B

> Move disk 1 from C to A

> Move disk 2 from C to B

> Move disk 1 from A to B

> Move disk 4 from A to C

> Move disk 1 from B to C

> Move disk 2 from B to A

> Move disk 1 from C to A

> Move disk 3 from B to C

> Move disk 1 from A to B

> Move disk 2 from A to C

> Move disk 1 from B to C

Explanation:

  • 循环遵循汉诺塔规则迭代地执行圆盘移动。
  • 它计算总移动次数为 2^n – 1,并利用位运算逻辑确定每一步应移动哪个圆盘。
  • 不使用递归调用,而是通过迭代生成移动序列,高效地模拟了递归过程。

使用递归法

在这种方法中,我们使用递归将问题分解为更小的子问题。其基本思路是先将 n-1 个圆盘移动到辅助柱,然后将最大的圆盘移动到目标柱,最后将 n-1 个圆盘从辅助柱移动到目标柱。

Python


CODEBLOCK_ac66ad2b

Output

> Move disk 1 from A to C

> Move disk 2 from A to B

> Move disk 1 from C to B

> Move disk 3 from A to C

> Move disk 1 from B to A

> Move disk 2 from B to C

> Move disk 1 from A to C

> Move disk 4 from A to B

> Move disk 1 from C to B

> Move disk 2 from C to A

> Move disk 1 from B to A

> Move disk 3 from C to B

> Move disk 1 from A to C

> Move disk 2 from A to B

> Move disk 1 from C to B

Explanation:

  • move_disks() 函数递归地将问题划分为更小的步骤。
  • 首先,它将顶部的 n-1 个圆盘移动到辅助柱,然后将最大的圆盘移动到目标柱。
  • 最后,它将 n-1 个圆盘从辅助柱移动到目标柱,递归调用会打印完成谜题所需的每一步。

> 亲自练习 汉诺塔 问题

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/28516.html
点赞
0.00 平均评分 (0% 分数) - 0