整理时间: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) #即step2HanoiTower(n-1,b,a,c) #即step3#注意这里的a b c顺序n=input(' 盘子数为: ')
n=int(n)
print('汉诺塔游戏的操作步骤如下:')
HanoiTower(n,'A','B','C')

运行结果:

结束。。。

扫码查看更多有意思的内容。。。

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

  1. linux开发汉诺塔游戏程序,汉诺塔游戏终极版

    今天,我完成了汉诺塔游戏终极版.使用一个脚本来输出汉诺塔自动运行的步骤,再通过管道提供给汉诺塔游戏,实现了自动完成汉诺塔. 在去年我用C语言写完汉诺塔游戏时,一直有个未完成的心愿.我希望能让汉诺塔自动 ...

  2. linux开发汉诺塔游戏程序,C语言实现汉诺塔游戏

    操作就是:A B 号码A的塔顶一层放在号码B的塔顶.如1(空格) 3 回车. 话说有人能把我这C的代码添加到QT界面框架上去么?  代码写的不好 ,维护性不够,只能玩8层的,写完以后发现很难拓展,软件 ...

  3. 要理解递归,得先理解递归--用Java语言由浅入深讲解汉诺塔游戏

    2019独角兽企业重金招聘Python工程师标准>>> 一.递归是什么? 定义:程序调用自身的编程技巧称为递归.它分为调用阶段和回退阶段,递归的回退顺序是它调用顺序的逆序. 递归使用 ...

  4. 【使用递归玩通关汉诺塔游戏】算法01-递归(斐波那契数列、汉罗塔问题)-java实现

    递归 定义:在一个方法(函数)的内部调用该方法(函数)本身的编程方式 简而言之就是 "自己调自己" 在玩游戏之前让我们先对递归有一个简单的了解吧! 5.1 递归简介 递归必须有一个 ...

  5. Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏

    Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏 目录 输出结果 核心代码 输出结果 核心代码 def hanoi(n,x,y,z):if n==1:print(x,'--→',z) ...

  6. java实现汉诺塔游戏(递归)(附超详细易懂注释)

    我们很容易能想到,可以用递归来实现汉诺塔游戏.因为要将n(n>1)个盘子从"源"柱子移到"目标"柱子,我们要先把n-1个盘子从"源"柱 ...

  7. CCF NOI1070 汉诺塔游戏

    问题链接:CCF NOI1070 汉诺塔游戏. 时间限制: 1000 ms  空间限制: 262144 KB 题目描述 汉诺塔由编号为1到n大小不同的圆盘和三根柱子a,b,c组成,编号越小盘子越小.开 ...

  8. 汉诺塔python创新设计_递归经典案例汉诺塔 python实现

    最近在廖雪峰大神的教程学习python 学到递归的时候有个汉诺塔的练习,汉诺塔应该是学习计算机递归算法的经典入门案例了,因此本人以为能够写篇博客来表达一下本身的看法.这markdown编辑器还不怎么会 ...

  9. c语言 汉诺塔游戏下载,使用C语言解决益智游戏——“汉诺塔”

    说明: 文章所有内容截选自实验楼教程[3个C语言实例带你掌握递归方法论],教程里还有两个实例,感兴趣的可以点击查看: 文章主要是带你通过解决这个游戏来利用递归解决实际问题并掌握其核心思想,懂得如何使用 ...

  10. 递归算法 —— Hanoi汉诺塔游戏

    前言 博客主页:干脆面la的主页 gitte链接:干脆面la的gitee仓库 刚学习完递归函数接触汉诺塔问题的时候,汉诺塔问题困扰了我很久.博主花了很长时间理解这道题目,因此整理出了用递归解决汉诺塔问 ...

最新文章

  1. mysql copy pending_mysql 案例 ~ 主从复制延迟之并行复制
  2. 动手实验2-ODCH(11)
  3. R语言Fine-Gray竞争风险模型实战
  4. 辨别 Windows CE, Windows XP Embedded 和 Windows Mobile
  5. 开发者需要了解的WebKit
  6. 21. Merge Two Sorted Lists
  7. java 定义一组常量用什么最好_Java语言中定义常量注意事项解析
  8. iOS 加入粘贴板的功能(复制功能)
  9. 通过powerdns实现主机名解析
  10. Oracle 常用命令举例
  11. 强势回归丨2021数据库大咖讲坛(第1期):数据库高可用容灾方案的实践与探索
  12. java mysql nclob_java向oracle数据库Clob读取,写入数据
  13. 显示部分x_i5 9400F+GTX 1030+23.8英寸,攀升迁跃者X上手简评
  14. python中的作用域_python中作用域
  15. 解读阿里巴巴Java手册:为什么不建议使用Executors创建线程池?
  16. 高等数学(下)知识点总结(1)
  17. 01 - Python 调用outlook发送邮件
  18. app系统服务器出错怎么回事,app连接服务器出错
  19. Unity 历史版本下载
  20. 互联网架构之 “高可用” 详解

热门文章

  1. Kinect2.0相机标定
  2. 理论+实验:Apache网页与安全优化(网页压缩、网页缓存、隐藏版本信息、网页图片防盗链)
  3. 使用kubeadm安装kuberneters
  4. ad18常用快捷键可以修改吗_AD18快捷键
  5. go语言:sync.Once的用法
  6. 鼎信诺虚拟服务器导数,鼎信诺审计软件常见问题
  7. LaTeX的长度单位
  8. English--consonant_摩擦音_咬舌音
  9. 空间直线与平面的交点
  10. Knowledge Representation笔记