更多数学趣题:Hanoi塔
===》点我返回目录《===
印度有个古老传说:在世界的中心贝拿勒斯的神庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上穿好了由大到小的64片金片,这就是汉诺塔。不论白天黑夜,一群沉默的僧侣在移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消失。
汉诺塔模型如上图,问题化成将A中的盘片最后转移到B中,可以借助中间一根柱子。
你上来就直接移动几个盘片,摆弄了几次,你放弃了,因为太繁琐了。碰到这种问题,我们一般是简化。
最简化的,是假设只有一个盘片,那太容易了,直接移到B;
次简化的,假设有两个盘片,那就把第一个小盘片移到中间的柱子,然后把底下的大盘片移到B,再之后把小盘片从中间移到B。
进一步,假设有三个盘片,步骤一是把第一个小盘片移到B,然后步骤二把第二个盘片移到中间,再之后步骤三把B上的小盘片移到中间,这样上面的两个盘片整体移到中间柱子了,所以步骤四就是把A剩下的底下那个大盘片移动到B,步骤五就是把中间柱子最上面的小盘片移动到A,步骤六把中间柱子下面的盘片移动到B,最后步骤七把A的小盘片移动到B。完毕。如下图所示:
我们仔细看上面的步骤,会发现一个关键点,就是对三个盘片来讲,就是要先想方设法让上面的两个整体移动到中间柱子,剩下的大盘片就直接移动到最后的目标了。
推广这个结论,对N个盘片,我们的任务就变成了先将N-1个盘片整体移动到中间柱子,然后就好办了,直接移动底下最大的那个。接下来的任务就是同样的了,不同之处在于少了一个盘片。这样一步步剩下N-1,然后N-2,...
所以,这个思路,就是递归的思路。n个盘片,123三根柱子,我们先把n-1个盘片整体从柱子1移动到柱子2,再把底下的第n个盘片从柱子1移动到柱子3,最后再把n-1个盘片整体从柱子2移到柱子3。程序实现:
def hanoi(n,a,b,c):if n == 1:print(n,a,c)returnhanoi(n-1,a,c,b)print(n,a,c)hanoi(n-1,b,a,c)print(hanoi(3,1,2,3))
解读一下。一步步跟踪。
第一层,hanoi(3,1,2,3),执行 hanoi(n-1,a,c,b)语句即 hanoi(2,1,3,2),递归进去,进入第二层;
第二层,hanoi(2,1,3,2),执行hanoi(n-1,a,c,b)语句即hanoi(1,1,2,3),递归进去,进入第三层;
第三层,hanoi(1,1,2,3),执行print(n,a,c)语句即print(1,1,3),返回到第二层;
继续第二层,执行print(n,a,c)语句即print(2,1,2),再执行hanoi(n-1,b,a,c)语句即hanoi(1,3,1,2),递归进去,再次进入第三层;
第三层,hanoi(1,3,1,2),执行print(n,a,c)语句即print(1,3,2),返回到第二层;
第二层语句都执行完了,返回第一层;
继续第一层,执行print(n,a,c)语句即print(3,1,3),再执行hanoi(n-1,b,a,c)语句即hanoi(2,2,1,3),递归进去,再次进入第二层;
第二层,hanoi(2,2,1,3),执行hanoi(n-1,a,c,b)语句即hanoi(1,2,3,1),递归进去,进入第三层;
第三层,hanoi(1,2,3,1),执行print(n,a,c)语句即print(1,2,1),返回到第二层;
继续第二层,hanoi(2,2,1,3),执行print(n,a,c)语句即执行print(2,2,3),再执行hanoi(n-1,b,a,c)即hanoi(1,1,2,3),递归进去,进入第三层;
第三层,hanoi(1,1,2,3),执行print(n,a,c)语句即print(1,1,3),返回到第二层;
第二层语句执行完了,返回第一层;
第一层语句也执行完了,完毕。
最后输出结果:
1 1 32 1 21 3 23 1 31 2 12 2 31 1 3
上面的调用过程可以用一个图直观展示:
从这个图我们可以看到,递归的调用过程是一棵树,逐层展开的逐层返回。我们对递归的详细介绍也到此为止,后面不这么一步步跟踪了。你要熟悉这个过程。
我们计算一下,N片要移动多少次?我们从上面代码看到了,f(k+1)=2*f(k)+1,不难证明f(n)=2n-1。从调用图示也可以看出来,第一层有一次,第二层有两次,第三层有四次。
按照传说,Hanoi塔上有64个盘片,所以一共要移动的次数为f(64)= 264-1=18446744073709551615。这是一个难以想象的大数。
如果这些僧侣一秒钟移动一次,大约要花584554049253.855年,也就是说需要5845亿年以上,而地球存在不过45亿年,太阳系的预期寿命据说也就是数百亿年。Hanoi塔搬完的那个时候,我们熟悉的一切,地球,太阳,星空,文明,估计都已经不存在了。
所以传说当僧侣们搬完这些金片的时候这世界就会消失,或许没有错啊。
更多数学趣题:Hanoi塔相关推荐
- 更多数学趣题:求对数
===>点我返回目录<=== 在数学中,对数是对求幂的逆运算,如果a的x次方等于N,那么数x叫做以a为底N的对数(logarithm),记作x=logaN. 这是我们现代人的理解方式,而从 ...
- 数学趣题——魔幻方阵
数学趣题--魔幻方阵 转载链接:http://www.cnblogs.com/steven_oyj/archive/2010/05/26/1744130.html 问题: 在n*n的矩阵中填写1~n* ...
- 数学趣题——谁在说谎
数学趣题--谁在说谎 转载链接:http://www.cnblogs.com/steven_oyj/archive/2010/05/26/1744227.html 问题:A说:B说谎.B说:C说谎.C ...
- 经典逻辑题-泊松数学趣题
据说泊松在青年时代研究过一个有趣的数学游戏: 某人有12品脱啤酒一瓶(品脱是英容量单位,1品脱=0.568升),想从中倒出6品脱.但是他没有6品脱的容器,只有一个8品脱的容器和一个5品脱的容器.怎样的 ...
- 数学趣题——寻找水仙花数
一个3位数若等于各位的立方和,即是水仙花数 源码如下: 1: #include <stdio.h> 2: 3: int IsNar(int a); 4: void Nar(); 5: 6: ...
- 数学趣题——求圆周率的近似值
应用数值概念算法求圆周率 数值概念算法(随机数方法):利用概率论解决问题, 在求圆周率时的核心思想是: 在一个边长为r的正方形中,以中心点为圆心,r为直径作圆,则圆的面积是1/4πr平方,而正方形面积 ...
- 数学趣题——渔夫抓鱼问题
A,B,C,D,E合伙抓鱼,全都睡着了.A第一个起来,将鱼分成5份,把多余的一条扔回河里,拿走自己一份走了.B第二个起来,又把鱼分成5份,把多余的一条扔回河里,拿走自己一份走了.接着,C,D,E都同样 ...
- 奔跑吧火柴人c语言开发_小学数学智力题:这两个火柴棍趣味题,你能做出来吗?...
数学也可以很有趣,甚至还能检测和开发孩子的智力呢,今天小编跟大家分享两个数学智力题,大家一起加入我们,看看这两个经典的火柴趣味小学数学智力题吧! [题目1]错误的等式 上图这个由火柴拼出的等式是错误的 ...
- 《趣题学算法》—第1章1.2节简单的数学计算
本节书摘来自异步社区<趣题学算法>一书中的第1章1.2节简单的数学计算,作者徐子珊,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.2 简单的数学计算 以上那 ...
最新文章
- 什么是java序列化_什么是Java序列化?为什么序列化?序列化有哪些方式?
- 计算机应用基础参考答案,计算机应用基础与参考答案
- 给女朋友讲ActiveMQ是啥?
- 更改记录表CDHDR和CDPOS
- 2002: [Hnoi2010]Bounce 弹飞绵羊
- 求栈的长度的C语言函数,c – 编译器如何确定编译器生成的临时函数所需的堆栈大小?...
- 使用HTML5实现地理位置定位
- jitter 如何优化网络_抖音优化该怎么做?
- Java中Dom解析xml文档
- php composer 无法下载,composer给laravel下载扩展包 无法下载的问题
- java有哪些服务器_java服务器有哪些?
- 芝麻信用分有哪些计算维度?关于大数据风控的87个问题
- vs2013调试nginx
- 如何下载网页上的视频和flash的方法
- 50%占空比的3分频器(奇数分频)
- 逻辑思维强的人适合学计算机不,逻辑思维强的人适合什么工作?
- 微信小程序内容接入安全检测接口
- 31个爱情原则让你受用终生
- 北交 操作系统 课程笔记(一)
- 企业微信版本更新(4.0.0.6003)