Python小练习 Vol.1:汉诺塔的移动(递归思维初体验)
🧠 Python小练习 Vol.1:汉诺塔的移动(递归思维初体验)
👋 本期带来的是递归中的经典问题——汉诺塔!
🧩 一、题目简介
汉诺塔问题是一个经典的递归算法问题,起源于印度的传说:
有三根柱子,第一根柱子上有若干个从大到小排列的圆盘。现在要把所有圆盘移动到第三根柱子上,一次只能移动一个盘子,且任何时刻都不能把大盘子放在小盘子上。
🧠 二、解题思路
将 n
个盘子从 A 柱子移动到 C 柱子:
- 先把前
n-1
个盘子从 A 移动到 B(借助 C) - 把第
n
个盘子从 A 移到 C - 再把
n-1
个盘子从 B 移动到 C(借助 A)
这个思路的关键在于 把大问题分解为小问题,并不断重复,这正是递归的魅力所在!
👨💻 三、Python代码实现
def hanoi(n, source, helper, target):
if n == 1:
print(f"将第1个盘子从 {source} 移动到 {target}")
else:
hanoi(n-1, source, target, helper)
print(f"将第{n}个盘子从 {source} 移动到 {target}")
hanoi(n-1, helper, source, target)
# 示例:移动3个盘子
hanoi(3, "A", "B", "C")
📌 四、输出示例(以3个盘子为例)
将第1个盘子从 A 移动到 C
将第2个盘子从 A 移动到 B
将第1个盘子从 C 移动到 B
将第3个盘子从 A 移动到 C
将第1个盘子从 B 移动到 A
将第2个盘子从 B 移动到 C
将第1个盘子从 A 移动到 C
📚 五、递归小结
✅ 递归的两个核心点:
- 明确终止条件(n = 1 时,直接移动)
- 找出重复结构(n 与 n-1 的移动方式一致)
⚠️ 避坑提醒:
- 避免忘记写终止条件,防止死循环
- 递归层数过多时,要注意 Python 的递归栈溢出问题(最大递归深度默认1000)
🚀 六、进阶拓展
- ✨ 添加一个变量统计总共移动了多少步
- ✨ 改写为非递归版本(使用栈模拟)
- ✨ 使用
turtle
或matplotlib
动态演示汉诺塔过程 - ✨ 制作 GUI 小游戏(比如 Tkinter)
❤️ 结语
如果你喜欢这种一步步拆解小题、深入理解原理的风格,欢迎点赞👍、收藏🌟、评论交流哦!
后续还会持续更新算法思维、Python 编程技巧等精彩内容~
📌 下一期想学习什么欢迎评论区留言~
👉 喜欢这个系列的话欢迎一键三连!