🔧 汉诺塔问题简介
汉诺塔(Tower of Hanoi)是一个经典的递归问题,起源于印度的传说:
有三根柱子,若干大小不一的圆盘最初依次叠放在一根柱子上(从下往上越小),目标是将这些圆盘全部移动到另一根柱子上,每次只能移动一个圆盘,并且在移动过程中任何时候都不允许把大圆盘放在小圆盘上面。
def hanoi(n, source, auxiliary, target):
"""
解决汉诺塔问题的递归函数
参数:
n -- 圆盘数量
source -- 源柱子(起始位置)
auxiliary -- 辅助柱子(中间位置)
target -- 目标柱子(目标位置)
"""
# 基本情况:只有一个圆盘时直接移动
if n == 1:
print(f"将圆盘 {n} 从 {source} 移动到 {target}")
return
# 步骤1:将n-1个圆盘从源柱移动到辅助柱(借助目标柱)
hanoi(n-1, source, target, auxiliary)
# 步骤2:将最大的圆盘从源柱移动到目标柱
print(f"将圆盘 {n} 从 {source} 移动到 {target}")
# 步骤3:将n-1个圆盘从辅助柱移动到目标柱(借助源柱)
hanoi(n-1, auxiliary, source, target)
# 测试汉诺塔函数
if __name__ == "__main__":
num_disks = int(input("请输入圆盘数量: "))
print(f"\n解决 {num_disks} 个圆盘的汉诺塔问题的步骤:")
hanoi(num_disks, 'A', 'B', 'C')
# 计算总步数
total_moves = 2 ** num_disks - 1
print(f"\n完成 {num_disks} 个圆盘的汉诺塔问题需要 {total_moves} 步")
📘 函数结构说明
-
hanoi(n, source, auxiliary, target)是递归函数:-
n: 当前需要移动的圆盘数 -
source: 起始柱子 -
auxiliary: 辅助柱子 -
target: 目标柱子
-
✅ 递归三步骤
-
将 n-1 个小圆盘从 source → auxiliary(借助 target)
-
将第 n 个最大圆盘从 source → target
-
将 n-1 个小圆盘从 auxiliary → target(借助 source)
🧠 递归核心思想
-
递归终止条件:当
n == 1,直接移动圆盘。 -
递归调用:通过改变参数顺序,模拟三根柱子之间的搬运过程。
-
时间复杂度:
-
T(n)=2T(n−1)+1⇒O(2n)T(n) = 2T(n-1) + 1 \Rightarrow O(2^n)
-
🎯 示例演示(n=3)
请输入圆盘数量: 3
解决 3 个圆盘的汉诺塔问题的步骤:
将圆盘 1 从 A 移动到 C
将圆盘 2 从 A 移动到 B
将圆盘 1 从 C 移动到 B
将圆盘 3 从 A 移动到 C
将圆盘 1 从 B 移动到 A
将圆盘 2 从 B 移动到 C
将圆盘 1 从 A 移动到 C
完成 3 个圆盘的汉诺塔问题需要 7 步
📊 公式说明
汉诺塔总步数为:
T(n)=2n−1T(n) = 2^n - 1
-
当 n = 3,步数 = 7
-
当 n = 5,步数 = 31
-
当 n = 10,步数 = 1023
汉诺塔的应用价值
汉诺塔问题不仅仅是理论上的递归练习,它还具有实际意义:
-
递归算法教学:是理解递归思想的经典案例
-
算法分析:帮助理解时间复杂度和递归深度
-
计算机科学:在编译器设计、内存管理等方面有应用
-
认知心理学:用于研究人类问题解决和决策过程
-
游戏设计:作为益智游戏的基础
总结
汉诺塔问题展示了递归算法的强大和优雅:
-
通过分解问题为更小的子问题解决复杂任务
-
递归基案例(n=1)是解决问题的关键
-
每个递归调用都遵循相同的模式
-
移动策略保证在任何时刻都不违反规则
理解汉诺塔问题对于掌握递归思想和算法设计非常重要。通过这个Python实现,你可以:
-
观察汉诺塔问题的解决过程
-
理解递归的工作原理
-
分析算法的时间复杂度
-
探索问题解决的不同策略
尝试运行代码并输入不同的圆盘数量(建议从1-5开始),观察解决过程,这将帮助你更深入地理解递归算法的精妙之处。
2万+

被折叠的 条评论
为什么被折叠?



