===》点我返回目录《===

印度有个古老传说:在世界的中心贝拿勒斯的神庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上穿好了由大到小的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塔相关推荐

  1. 更多数学趣题:求对数

    ===>点我返回目录<=== 在数学中,对数是对求幂的逆运算,如果a的x次方等于N,那么数x叫做以a为底N的对数(logarithm),记作x=logaN. 这是我们现代人的理解方式,而从 ...

  2. 数学趣题——魔幻方阵

    数学趣题--魔幻方阵 转载链接:http://www.cnblogs.com/steven_oyj/archive/2010/05/26/1744130.html 问题: 在n*n的矩阵中填写1~n* ...

  3. 数学趣题——谁在说谎

    数学趣题--谁在说谎 转载链接:http://www.cnblogs.com/steven_oyj/archive/2010/05/26/1744227.html 问题:A说:B说谎.B说:C说谎.C ...

  4. 经典逻辑题-泊松数学趣题

    据说泊松在青年时代研究过一个有趣的数学游戏: 某人有12品脱啤酒一瓶(品脱是英容量单位,1品脱=0.568升),想从中倒出6品脱.但是他没有6品脱的容器,只有一个8品脱的容器和一个5品脱的容器.怎样的 ...

  5. 数学趣题——寻找水仙花数

    一个3位数若等于各位的立方和,即是水仙花数 源码如下: 1: #include <stdio.h> 2: 3: int IsNar(int a); 4: void Nar(); 5: 6: ...

  6. 数学趣题——求圆周率的近似值

    应用数值概念算法求圆周率 数值概念算法(随机数方法):利用概率论解决问题, 在求圆周率时的核心思想是: 在一个边长为r的正方形中,以中心点为圆心,r为直径作圆,则圆的面积是1/4πr平方,而正方形面积 ...

  7. 数学趣题——渔夫抓鱼问题

    A,B,C,D,E合伙抓鱼,全都睡着了.A第一个起来,将鱼分成5份,把多余的一条扔回河里,拿走自己一份走了.B第二个起来,又把鱼分成5份,把多余的一条扔回河里,拿走自己一份走了.接着,C,D,E都同样 ...

  8. 奔跑吧火柴人c语言开发_小学数学智力题:这两个火柴棍趣味题,你能做出来吗?...

    数学也可以很有趣,甚至还能检测和开发孩子的智力呢,今天小编跟大家分享两个数学智力题,大家一起加入我们,看看这两个经典的火柴趣味小学数学智力题吧! [题目1]错误的等式 上图这个由火柴拼出的等式是错误的 ...

  9. 《趣题学算法》—第1章1.2节简单的数学计算

    本节书摘来自异步社区<趣题学算法>一书中的第1章1.2节简单的数学计算,作者徐子珊,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.2 简单的数学计算 以上那 ...

最新文章

  1. 什么是java序列化_什么是Java序列化?为什么序列化?序列化有哪些方式?
  2. 计算机应用基础参考答案,计算机应用基础与参考答案
  3. 给女朋友讲ActiveMQ是啥?
  4. 更改记录表CDHDR和CDPOS
  5. 2002: [Hnoi2010]Bounce 弹飞绵羊
  6. 求栈的长度的C语言函数,c – 编译器如何确定编译器生成的临时函数所需的堆栈大小?...
  7. 使用HTML5实现地理位置定位
  8. jitter 如何优化网络_抖音优化该怎么做?
  9. Java中Dom解析xml文档
  10. php composer 无法下载,composer给laravel下载扩展包 无法下载的问题
  11. java有哪些服务器_java服务器有哪些?
  12. 芝麻信用分有哪些计算维度?关于大数据风控的87个问题
  13. vs2013调试nginx
  14. 如何下载网页上的视频和flash的方法
  15. 50%占空比的3分频器(奇数分频)
  16. 逻辑思维强的人适合学计算机不,逻辑思维强的人适合什么工作?
  17. 微信小程序内容接入安全检测接口
  18. 31个爱情原则让你受用终生
  19. 北交 操作系统 课程笔记(一)
  20. 企业微信版本更新(4.0.0.6003)

热门文章

  1. ftp服务器需要ssl证书吗,启用SSL加密功能确保FTP服务器安全性
  2. 将字符串转化为16进制数
  3. linux的vi主要用来做什么,vi可以做什么?
  4. SDU创新实训 9.创建各类文件数据汇总整理
  5. 高一下册计算机教案,高一下册物理下册教案设计
  6. 关于公钥与私钥的一点看法
  7. java备忘录模式 类图,Android编程设计模式之备忘录模式详解
  8. Linux安装Opencc
  9. phpmyadmin新建数据库无权限
  10. 处理数据中分类变量的三种方法(附代码实现)