赞
踩
汉诺塔(Tower of Hanoi)是一个经典的数学问题。它包含三个柱子(通常称为A(start)、B(auxiliary)和C(end)),以及一组从小到大排列的圆盘,开始时所有圆盘都放在A柱子上。目标是将所有圆盘从A柱子移动到C柱子上,期间可以借助B柱子作为辅助。其规则是:一次只能移动一个圆盘,并且大圆盘不能在小圆盘上面
以三个圆盘为例子,他的移动过程如下:
(图片来源:如何理解汉诺塔的递归? - 知乎 )
那么如何将n个圆盘移动到C列,其实这个过程我们可以看作三步:
1.把n-1个圆盘放到辅助列B
2.将A上剩余的一个圆盘放到C
3.将辅助列B上的n-1个圆盘拿到C
想必看到这有人会问:万一n>2,不就不能同时移动n-1个圆盘了吗?
其实这就又变成了一道m层汉诺塔的问题(m=n-1),即如何将n-1个盘移动到辅助B列,只要先将n-2个移动到END列,再将此时最后一个盘移动到最终列B,最后将移至END列的n-2个盘移动到辅助B列
只是此时以n-1个圆盘的视角来看,B列变成了我们的END最终列,C列也就变成了我们的auxiliary辅助列
我们来看代码:
- def hanio(n, start, auxiliary,end):
- if n == 1:
- print("将圆盘从" + start + "移动到" + end)
- else:
- # 1. 将n -1个圆盘从A柱(start)经过C柱(end)移动到辅助柱B(auxiliary)
- hanio(n - 1, start, end,auxiliary)
-
- # 2. 将n个圆盘从A柱(start)移动到C柱(end)
- hanio(1, start, auxiliary, end)
-
- # 3. 将n-1个圆盘从辅助柱B(auxiliary)经过A柱(start)移动到C柱(end)
- hanio(n - 1, auxiliary, start, end)
-
-
- hanio(3, "A", "B", "C")
以下是运行结果:
- 将圆盘从A移动到C
- 将圆盘从A移动到B
- 将圆盘从C移动到B
- 将圆盘从A移动到C
- 将圆盘从B移动到A
- 将圆盘从B移动到C
- 将圆盘从A移动到C
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。