python解决汉诺塔问题(可助于理解递归)
1. 汉诺塔是什么?
问题:有三个柱子,n个大小不等的圆盘,每次只可以移动一个圆盘,且大圆盘不能压着小圆盘,求需要多少次移动才可以把A柱中的圆盘全部转移到C柱????
考虑一下特殊情况,ABC三柱里面,A柱有且只有一个圆盘。那么只需要:
move: A --> C 移动了 1 次
若有两个圆盘:
move: A --> B 移动了 1 次
move: A --> C 移动了 2 次
move: B --> C 移动了 3 次
若有三个圆盘:
move: A --> C 移动了 1 次
move: A --> B 移动了 2 次
move: C --> B 移动了 3 次
move: A --> C 移动了 4 次
move: B --> A 移动了 5 次
move: B --> C 移动了 6 次
move: A --> C 移动了 7 次
可以看出具体分为3个步骤:
- 将A上层n-1个圆盘移动到B,C作为中转站;
- 将A剩下的一个圆盘移动到C;
- 将n-1个圆盘从B移动到C,A为中转站;
所谓的汉诺塔问题其实就是重复重复再重复上述的三个步骤。
2. python解决汉诺塔问题
def hanoi(n, a, b, c):
global i
if n == 1: # 递归的收敛条件,当n为1,时,执行移动的操作
i += 1
print('move:', a, '-->', c, '移动了', i, '次')
return
hanoi(n - 1, a, c, b) # 将A上层n-1个圆盘移动到B,C作为中转站;
hanoi(1, a, b, c) # 将A剩下的一个圆盘移动到C;
hanoi(n - 1, b, a, c) # 将n-1个圆盘从B移动到C,A为中转站;
i = 0
hanoi(int(input("请问有几个圆盘:")), 'A', 'B', 'C') # 给定盘子数,a,b,c分别叫A,B,C