欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python Basic - 汉诺塔(Tower Of Hanoi)(递归实现)

程序员文章站 2022-04-06 20:49:44
...

什么是汉诺塔

汉诺塔百度百科链接

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

Python Basic - 汉诺塔(Tower Of Hanoi)(递归实现)
图片来源于网络

汉诺塔规则与实现思路

实验目标

  1. 将A柱上的圆盘,按照规则挪到C柱上。

游戏规则

  1. 从上往下的大小顺序不变
  2. 挪动过程中,不允许出现大的盘在小的盘上面。
  3. 3个柱上均可放置盘片
  4. 一次只能挪动一个盘

实验思路

先考虑1–3个盘的情况,再考虑多个盘的情况

1个盘的情况:

  1. A ==> C

2个盘的情况:

  1. A ==> B
  2. A ==> C
  3. B ==> C

3个盘的情况:

  1. A ==> C
  2. A ==> B
  3. C ==> B
  4. A ==> C
  5. B ==> A
  6. B ==> C
  7. B ==> C

停下来思考

3个盘的情况还较简单,但是盘再多就很复杂了。于是我们需要一个更简单的办法,在上述3个盘的情况下,我们可以发现,其实2个盘的情况还是很简单的。所以可以使用数学中的抽象法,将3个盘抽象成两个盘,具体方法如下;

  1. 先将A柱上面的2个盘当成一个整体(抽象成1个)移动到B柱上。
  2. 再将A柱上第3个盘子移到C柱上
  3. 最后将B柱上的2个盘子移到C柱上,完成。

再用数学归纳法,扩展到n个盘子的情况:

  1. 先将A柱上面的第1到第n-1个(抽象成一个整体)盘子移动到B柱上
  2. 再将A柱上最后一个盘子移动到C柱上
  3. 最后将B柱上的n-1个盘子移动到C柱上。完成

还剩最后一个问题

如此,还剩一个问题就是,那上面n-1个盘子怎么移?
在上面的数学归纳法中,我们在移动的时候,压根没有考虑上面的n-1个盘是怎么移的。
我们先换个思路,我们把A柱 上面n-1个盘当成一个整体时,A柱让最下面那个盘就是最大的,游戏规则是允许小盘在大盘上,所以我们是否可以先当这个最大的盘不存在,然后先考虑n-1个盘怎么移动到C柱上?

  1. 将A柱上的第1到第n-2个当成一个整体,怎么样移我不管,但是必需统统都都移动到C柱上去,且必需满足游戏规则,不允许大的在小的上面。
  2. 将A柱上的第n-1个盘移动到B柱上
  3. 最后将C柱上的所有盘全部移动到B柱上

如此一来,是不是规模就变小了一次。但是解决问题的办法还是一样的方法,所以我们一直重复利用这个方法,直到只剩下1个盘的时候就比较简单了。

思路总结

  1. 将A柱上的1到n-1个盘借助C柱的空闲状态移动到B柱上去
  2. 将第n个盘,也就是最后一个盘直接移到C柱上
  3. 再将B柱上的1到n-1个盘借助A柱的空闲状态移到C柱上去。

Python代码实现

实验目的

编写一段python 代码,使用函数,让用户指定盘的数量,打印出将所有盘片从A移到C柱上的所有步骤

伪代码看过程

将A柱上的n个盘片从A柱借助B柱移动到C柱上
如果 只有一盘片:
	则直接从A柱上移动到C柱上
否则
	先将n-1个盘片从A柱上借用C柱移动到B柱上
	再将A柱上的最后一个盘片移动到C柱上
	最后将B柱上的n-1个盘片借助A移动到C上

实验代码看执行效果(代码可直接复制后运行)

 def TowerOfHanoi(n,A,B,C):#n个盘在A柱上,借用B柱的空闲移到C柱上
    if n == 1:#如果只有一个盘,
        print(A ,"==>", C)#则直接从A移到C上
    else:#否则
        TowerOfHanoi(n-1,A,C,B)    #先将n-1个盘从A柱上利用C柱移动到B柱上
        print(A,"==>",C)            #再将A上的最后一移到C柱上
        TowerOfHanoi(n-1,B,A,C)    #最后将B柱上的n-1个盘借助A柱的空闲移动到C柱上

TowerOfHanoi(int(input("Please input how much disc in A pillar.we will tell you how to move the disc:")),"A","B","C")

结果输出

一个铁片移动

Please input how much disc in A pillar.we will tell you how to move the disc:1
A ==> C

两个铁片移动

Please input how much disc in A pillar.we will tell you how to move the disc:2
A ==> B
A ==> C
B ==> C

三个铁片移动

Please input how much disc in A pillar.we will tell you how to move the disc:3
A ==> C
A ==> B
C ==> B
A ==> C
B ==> A
B ==> C
A ==> C

四个铁片移动

Please input how much disc in A pillar.we will tell you how to move the disc:4
A ==> B
A ==> C
B ==> C
A ==> B
C ==> A
C ==> B
A ==> B
A ==> C
B ==> C
B ==> A
C ==> A
B ==> C
A ==> B
A ==> C
B ==> C

五个铁片移动

Please input how much disc in A pillar.we will tell you how to move the disc:5
A ==> C
A ==> B
C ==> B
A ==> C
B ==> A
B ==> C
A ==> C
A ==> B
C ==> B
C ==> A
B ==> A
C ==> B
A ==> C
A ==> B
C ==> B
A ==> C
B ==> A
B ==> C
A ==> C
B ==> A
C ==> B
C ==> A
B ==> A
B ==> C
A ==> C
A ==> B
C ==> B
A ==> C
B ==> A
B ==> C
A ==> C
相关标签: Python