插图详解Python解决汉诺塔问题
关于汉诺塔问题,这里有一个传说:
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。 ——(来源于百度百科)
果真,只有数学家才会提出这样会让人初步抓狂的事情。
重要的事情是,这个事情还有预言,天知道,当初玛雅预言2012年12月21日的时候,当初我紧张的要死,生怕第二天看不到隔壁家的小妹妹了。
本次的预言如果实现的话,估计是没有痛苦的:这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今还在一刻不停地搬动着圆盘。
下面进入分析阶段,着急的小伙伴请直接看后面代码
很多人初步一看,这就是个预言,能有啥?可是你要看前面,这是一个数学家提出的问题,数学家一般不会讲故事,他一旦讲故事,多半会让人崩溃。比如,在没有数学模型之前,你是不是和我一样,有些发懵,什么宝石针,为什么是64片,为什么每一次只能移动一个,还得小的必须在上面,究竟是什么样的呢?
别怕,来看一下图片,缓解一下你有些发懵的大脑:
看完图,是不是好一些呢,其实就是这样的有三根柱子,我们分别命名为ABC,原来是在A柱上有64颗圆盘,现在是要把这些圆盘移动到C上,中间可以临时把圆盘放在C上,B柱为过渡用的。
其实,我们在分析任何问题的时候都可以借助模型,因为人脑对于图画的感受要远远强于对文字的感悟
我们先不管他有 多少个圆盘(假设为n个)
第一:假设只有一个圆盘(n=1):
那是不是就一步就可以了,也就是直接把圆盘从A挪到C上,就可以了,表示为 A --> C;
第二:假设只有两个圆盘(n=2):
我们先把小圆盘从A移动到B,表示为A --> B,
其次把大圆盘从A移动到C,表示为 A --> C,
最后把小圆盘从B移动到C,表示为 B --> C;
第三:假设有三个圆盘(n=3):
先把最小的圆盘移动到C,表示为 A --> C,
第二次把中间的圆盘移动到B,表示为A --> B,
第三次把小圆盘从C移动到B,表示为C --> B,
第四次把大圆盘从A移动到C,表示为A --> C,
第五次把小圆盘从B移动到A,表示为B --> A,
第六次把中间的圆盘从B移动到C,表示为B --> C,
最后把小圆盘从A移动到C,表示为A --> C;
提前看一下代码演示:
第四:假设有n个圆盘呢(n=n):
我们该怎么办呢?
别急,来一杯82年的可乐丫丫筋
请欣赏:
我们可以把n个圆盘,分成两部分:第n个,和剩下的n-1个
接下来把n-1个通过C移动到B上
再把A上的第n个移动到C上,
最后把n-1个移动到C上
大家,不用管中间是怎么移动的,就把他看成是两个部分,这里涉及到了递归的思想,程序调用自身的编程技巧称为递归( recursion),这些都交给计算机去办,比如在上述问题中计算机会把n-1个圆经过C移动到B上,再把第n个移动到C上,然后他接着会回去处理剩下的n-2个,经由C移动到A上,把第n-1个移动到C上,也就是如下图所示的样子:
大家发现了没有,是不是又回到我们最初的样子了,依次是把n-3个经由C移动到B上,再把剩下的第n-2个移动到C上,然后再把第n-4个移动经由C移动到A上,把第n-3个移动到C上...依次类推,直到最后一个完整的移动到C上,我们可以看出在移动的过程中可以不断的重复之前的动作,放到数学和编程里面来说,就是他在不断的调用自身,直到完成要求。
Python代码演示:
def hanoi(n,a,b,c):'''n:圆盘的个数,a:汉诺塔的A柱,b:汉诺塔的B柱,c:汉诺塔的C柱'''if n == 1:print(a,"-->",c)return Noneif n == 2:print(a,"-->",b)print(a,"-->",c)print(b,"-->",c)return Nonehanoi(n-1,a,c,b)#把n-1个盘子从A,由C,移动到B上print(a,"-->",c)hanoi(n-1,b,a,c)#把n-1个盘子从B,经由A,移动到C上a = "A"
b = "B"
c = "C"
n = 1
hanoi(n,a,b,c)A --> Cn = 2
hanoi(n,a,b,c)A --> B
A --> C
B --> Cn = 3
hanoi(n,a,b,c)A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
插图详解Python解决汉诺塔问题相关推荐
- 用 python 解决汉诺塔问题并附带演示过程
用 python 解决汉诺塔问题并附带演示过程 参考文章: (1)用 python 解决汉诺塔问题并附带演示过程 (2)https://www.cnblogs.com/shinawear/p/1061 ...
- python汉诺塔递归算法流程图,python实现汉诺塔递归算法经典案例
Python汉诺塔递归问题 python请用递归算法编程解决汉诺塔问题 在线等 关于python递归函数实现汉诺塔 def move(n,a,b,c): #1 if n==1: #2 print(a, ...
- python 游戏 —— 汉诺塔(Hanoita)
python 游戏 -- 汉诺塔(Hanoita) 一.汉诺塔问题 1. 问题来源 问题源于印度的一个古老传说,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆 ...
- 2.2基本算法之递归和自调用函数_用栈算法递归解决汉诺塔问题
今天博主收一下线性表的尾,最近我们要学习的内容是栈和队列板块,栈和队列板块分为两讲,第一讲也就是今天我们主要学习栈的相关知识,包括栈的定义.栈的顺序表示及实现,栈的链式表示,栈的应用举例,以及栈递归实 ...
- c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑
c语言递归解决汉诺塔参数变化的疑惑 答案:3 信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...
- python中汉诺塔如何理解_python汉诺塔问题的递归理解
一.问题背景 汉诺塔问题是源于印度一个古老传说. 源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下 ...
- 使用Python查看汉诺塔移动详细过程
汉诺塔属于比较经典的问题,详见以前的文章Python模拟汉诺塔问题移动盘子的过程,基于非递归算法的汉诺塔游戏之Python实现. 本文代码功能:模拟移动汉诺塔上的盘子,并实时显示3根柱子上盘子的情况. ...
- c语言递归解决汉诺塔问题
c语言递归解决汉诺塔问题 参考文章: (1)c语言递归解决汉诺塔问题 (2)https://www.cnblogs.com/didiaoxiaoguai/p/6686407.html 备忘一下.
- 数据结构之递归算法解决汉诺塔问题
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...
- python递归算法 - 汉诺塔问题
python递归算法 - 汉诺塔问题 经典汉诺塔问题: 有三根柱子a,b,c,在一根柱子a上,从下往上按照从大到小的顺序摞着64片黄金圆盘.把所有圆盘从下往上按从大到小的顺序重新摆放在另一根柱子c上. ...
最新文章
- 个人站立会议(11月24日)
- 第一篇:VC连接MySql
- 天通苑海鲜餐馆数据调查,很难想象消费越贵越受欢迎
- android 保存退出之前的页面_项目实战:Qt+Android模拟操作器(模拟操作app,打开,点击,输入,获取验证码等等)...
- boost::geometry::tuples用法的测试程序
- 贝叶斯分类器_python机器学习API介绍10:多项式贝叶斯分类器
- java弹出虚拟键盘_JS实现电脑虚拟键盘的操作
- 华为专家助你1个月拿下物联网高工认证,首次提供全方位就业指导!
- Ubuntu 16.4中root不能使用tab键来补全命令的解决方法
- 安装ugjava安装在哪里_讨论!空调安装安全绳该挂哪里
- Datawhale 零基础入门CV赛事-Task2 数据读取与数据扩增
- 白化(Whitening): PCA白化 ZCA白化
- android访问链接,尝试使用Android访问本地Web服务时连接被拒...
- 如何批量将 Word 文档转为 PDF 格式
- svn忽略不需要同步的文件夹_配置管理-SVN使用指南 - wuli潇潇
- Star Way To Heaven 题解
- 高中计算机在线使用方法,高中-信息技术-手动搜题-在线组卷
- 如何写毕业论文(个人心得,不是保姆级)
- 2019日历全年一张_2020年剑桥英语全年考试日历发布,参与活动还能赢取实体台历!...
- jmpi 与ljmp指令分析