汉诺塔游戏程序可以通过“递归”来实现?但你未必清楚其根本原因。

整理时间:2020-03-11
本文内容梳理

1.汉若塔游戏

2.试着玩一下

3.分析下这个游戏,怎么就能用递归搞定

4.Python代码与实现结果

0.写在前面

由于疫情严重,在家隔离,给自己找点事情,脑子不动会生锈。

好吧,Python现在很火,学学吧,毕竟对于我一个上有老下有小的苦逼职场狗,脑子要是不好使,不说定哪天把工作丢了,那可咋整。

一句话,为了钱,脑子得动起来。

1.汉若塔游戏

为防止大脑生锈,研究下这个古老的游戏吧,顺便学习Python(毕竟它很火,说不定能靠它挣钱)。对,就是下图这个游戏,大家不会陌生的。
在这里插入图片描述

游戏的玩法

怎么算是赢:

把A柱上的盘子搬到C柱上,必须得按照原先的排列放置,较大盘子在下面,较小盘子在上面,就赢了。

必须遵循什么规则:

每一次只能挪动一个盘子,且整个过程要一直保证较小盘子要在较大盘子上面。

2.试着玩一下吧

由易到难,不要心急。

1)先来1个盘子的,直接从A柱子上取出,放置到C柱子上。好吧,简单到侮辱智商了。1小步就搞定。

2)来2个盘子的,先把1号盘子从A放在B上,然后再把2号盘子从A放在C上,然后在把1号盘子从B放在C上。需要3小步才能搞定。

3 ) 来3个盘子的,先把1号盘子从A放在C上,然后把2号盘子从A放在B上,再把1号盘子从C放到B上,再把3号盘子从A放在C上,然后再把1号盘子从B到A,再把2号盘子从B到C,最后把1号盘子从A到C。需要7小步才能搞定。

4)那么,来4个盘子的,步骤会更多,好麻烦,这个游戏的起源竟然是印度那个故事,要64个盘子,把那个放盘子的人能累死。

5)那么,是N个盘子呢,有啥规律吗,对,我要的是公式。类似拼魔方的口诀或者公式。怎么搞!!

【注】:盘子的序号标法为从小到大,分别为1、2、3…

【注】:印度那个故事,相传是大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下到上放置了64个黄金圆盘。大梵天命令婆罗门从下面开始,从大到小重新摆在另一个柱子上,并规定,一次只能动一个盘子,而且过程中,一定要保证小盘子一直处于大盘子的上面。

3.游戏分析,怎么用代码实现,为啥和“递归”能扯上关系

上面,已经见识了,随着盘子数目的增加,小步骤越来越多,好烦呀。要让计算机实现,怎么搞。计算机要实现,它要的是准确的程序或者说是步骤方法,有没有啥公式或者口诀呢。

很多人了解过这个游戏的代码,肯定能说出这个要用递归。你如果再问一句,为什么要用递归,恐怕这时候回答上来的人就不多了。

3.1 还原现场

废话不说了,来,还原下现场。

在这里插入图片描述

图1:情况为1个盘子

在这里插入图片描述
图2:情况为2个盘子

在这里插入图片描述
图3:情况为3个盘子

针对图3 说点话:

哎哎哎,这不对呀,上面说的是3个盘子需要的是7步呀,你这咋是3步。请注意,这里说的这3步是概括的3大步,这3大步 里面有7小步。

哎哎哎,你这为啥要“概括 ”呢,我就是不想概括,好啦,大哥,你不概括怎么找规律呢,形成套路呢。 请记住,年轻人,概括总结提炼广义,这是一种研究问题的好方法呀。

3.2 关键关键哦

重点也是难点,注意注意,字字珠玑,请耐心读。理解到这一点,你就理解了 为什么要递归了。

图3的step3,里面是有3小步的,我们把它概括为1大步。 这一大步,就是 把1号和2号盘子 借助A柱 从B放置到C 上。因为C柱的 3号 盘子 是这里面最大的,所以不用动,可以忽略它的存在。step3这一大步可以等价为图4所示。
在这里插入图片描述
图4:情况为3个盘子时step3这一大步的解释

那情况为3个盘子时,这个step3不就是 两个盘子的整个步骤了吗。只是这里B柱是两个盘子情况中的A柱了。

这不就可以使用上一种情况的步骤了吗。再说递归是啥,它就是可以使用前面情况的结果。

同理,再想想图3中的step1,因为也是3号盘不用动,它等价为图5所示。
在这里插入图片描述
图5:情况为3个盘子时step1这一大步的解释

那情况为3个盘子时,这个step1不就是 两个盘子的整个步骤了吗。只是这里B柱是两个盘子情况中的C柱了。

【注】:请注意,情况为3个盘子时,这个step1和这个step3的区别与联系,总的来说,他们是一种操作,只是ABC柱的关系要搞清楚。

3.3 总结方法,对,就是游戏攻略

小结一下,不难推导出N个盘子的操作步骤。

在这里插入图片描述
图6:N个盘子

那情况为N个盘子时:

(1)图6的step1就类似情况为N-1个盘子时的整个步骤。只是这里A柱为初始柱,B柱为目标柱。

对应代码:HanoiTower(n-1,a,c,b) #即step1

(2)图6的step2就是情况为 N个盘子时的最后1个盘子从A柱放到C柱了。这里A柱为初始柱,C柱为目标柱。

对应代码: print(a,’—>’,c) #即step2

(3)图6的step3就类似情况为N-1个盘子时的整个步骤。只是这里B柱是初始柱,C柱为目标柱。

对应代码: HanoiTower(n-1,b,a,c) #即step1

【注】:上面我的用词为“类似”,没有用“是”这个词

【注】: 原始柱的意思是游戏最开始挂盘子柱子;

           目标柱的意思是游戏最终挂盘子的柱子;

OK,大功告成,汉诺塔游戏的公式搞定了,迫不及待了,赶快让我码起来!!我要实现它!!!

4.Python代码与实现结果
在这里插入图片描述

代码:


#打印输出汉诺塔游戏的操作攻略

def HanoiTower(n,a,b,c):
    #n为盘子数目,
    #a为起始柱子,最开始为满,最后这个柱子是空的
    #b为中间柱子,最开始为空,最后这个柱子是空的
    #c为目标柱子,最开始为空,最后这个柱子是满的
    if n==1:
        print(a,'--->',c)
    else:
        HanoiTower(n-1,a,c,b) #即step1
        #注意这里的a b c顺序
        print(a,'--->',c) #即step2
        HanoiTower(n-1,b,a,c) #即step3
        #注意这里的a b c顺序

n=input(' 盘子数为: ')
n=int(n) 
print('汉诺塔游戏的操作步骤如下:')
HanoiTower(n,'A','B','C')

运行结果:
在这里插入图片描述在这里插入图片描述

结束。。。

扫码查看更多有意思的内容。。。
在这里插入图片描述

发布了115 篇原创文章 · 获赞 104 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/hahahahhahha/article/details/104794094