当前位置:   article > 正文

Python实现汉诺塔问题的递归算法_汉诺塔python代码递归

汉诺塔python代码递归

  汉诺塔(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辅助列

我们来看代码:

  1. def hanio(n, start, auxiliary,end):
  2. if n == 1:
  3. print("将圆盘从" + start + "移动到" + end)
  4. else:
  5. # 1. 将n -1个圆盘从A柱(start)经过C柱(end)移动到辅助柱B(auxiliary)
  6. hanio(n - 1, start, end,auxiliary)
  7. # 2. 将n个圆盘从A柱(start)移动到C柱(end)
  8. hanio(1, start, auxiliary, end)
  9. # 3. 将n-1个圆盘从辅助柱B(auxiliary)经过A柱(start)移动到C柱(end)
  10. hanio(n - 1, auxiliary, start, end)
  11. hanio(3, "A", "B", "C")

以下是运行结果:

  1. 将圆盘从A移动到C
  2. 将圆盘从A移动到B
  3. 将圆盘从C移动到B
  4. 将圆盘从A移动到C
  5. 将圆盘从B移动到A
  6. 将圆盘从B移动到C
  7. 将圆盘从A移动到C

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号