一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

  不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。

  假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时,假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下:

18446744073709551615秒

  这表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。

  如果用非递归的方法来实现,代码将非常复杂,那么用递归的方式,代码如何呢?如下。dart语言实现。

 1 int _count = 0;
 2
 3 void hanoi(int n) {
 4   _hanoi(n, 'A', 'B', 'C');
 5   print('---------------------------');
 6   print('total moved: $_count times.\n');
 7 }
 8
 9 void _hanoi(int n, String origin, String assist, String destination) {
10   if (n == 1) {
11     _move(origin, destination);
12   } else {
13     _hanoi(n - 1, origin, destination, assist);
14     _move(origin, destination);
15     _hanoi(n - 1, assist, origin, destination);
16   }
17 }
18
19 void _move(String from, String to) {
20   _count++;
21   print('move $_count times:\tfrom $from to $to');
22 }

_count 用来记录移动次数,_move 表示从柱子 from 移动到 柱子 to.

转载于:https://www.cnblogs.com/outerspace/p/10827918.html

递归算法之汉诺塔的实现相关推荐

  1. 基于非递归算法的汉诺塔游戏之Python实现

    本文代码涉及到汉诺塔问题的非递归算法,可能不是很好理解,我在代码中加了大量注释,希望能够有所帮助,如果实在难以理解的话,请搜索这个算法并结合下面的代码进行阅读和理解.感谢国防科技大学刘万伟老师提供算法 ...

  2. 数据结构之递归算法解决汉诺塔问题

    汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...

  3. 递归算法之汉诺塔问题

    问题叙述 故事背景: 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上 ...

  4. 算法与程序设计递归算法理解——汉诺塔

    目录 1.理解汉诺塔问题可以先从下面两点入手 2.列出一到四层汉诺塔移动顺序寻找规律 3.将移动顺序用树状图来表示 4.将树状图转化为程序实现 1.理解汉诺塔问题可以先从下面两点入手 根据汉诺塔移动规 ...

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

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

  6. python每日算法 | 算法的起步与递归算法(汉诺塔问题)

    创作不易,来了的客官点点关注,收藏,订阅一键三连❤

  7. python 利用递归算法来完成计算乘阶、斐波那契数列、汉诺塔

    一.求一个整数的阶乘: 1.常用的迭代方法写法: def jc(n):result = nfor i in range(1, n):result *= ireturn resultnu = int(i ...

  8. 使用Python查看汉诺塔移动详细过程

    汉诺塔属于比较经典的问题,详见以前的文章Python模拟汉诺塔问题移动盘子的过程,基于非递归算法的汉诺塔游戏之Python实现. 本文代码功能:模拟移动汉诺塔上的盘子,并实时显示3根柱子上盘子的情况. ...

  9. 汉诺塔详解(超详细)

    递归算法求汉诺塔(C语言版) 汉诺塔: 梵天创造世界的时候做了三根金刚石柱子,x y z三根柱子 在x柱子上 从上往下按照从小到大顺序摞着64片黄金圆盘. 梵天命令婆罗门把圆盘从x柱移到z柱 并且规定 ...

最新文章

  1. 实用手册|史上最全的Pycharm快捷键操作
  2. 小鹏汽车招股书,满是智能技术自研的标签
  3. 阿里敏捷实践| 4个迭代,从批量交付向持续交付转型 1
  4. ECharts Tooltip
  5. 学计算机对显卡要求大吗,【5人回答】学AE的电脑配置要求高吗?需要什么样的电脑配置-3D溜溜网...
  6. Java修炼之道--I/O
  7. SAP License:跨行如何转入SAP
  8. android 打包成多个so,Android Studio打包.so库到apk中实例详解
  9. python篇 006-- pycharm vsc 编写python(对比浅析混合使用) pycharm篇
  10. 分布式系统的SLA如何定义
  11. java中宏定义,宏定义的使用
  12. 基于胜任力模型为集团企业构建动态信息安全培训课程体系
  13. CSP初赛基础知识整理
  14. 一个故事弄懂域名解析
  15. c语言-选手评分系统
  16. log4j2 pattern详解
  17. Activity 边边角角
  18. HCIP之排障(三)ISIS故障排除
  19. Robust Network Traffic Classification
  20. 帧间预测(三)symmetric MVD mode

热门文章

  1. Vue-nginx反向代理
  2. 天气API Http接口
  3. 申请微信小游戏流量主提示 “填写的姓名或身份证与公众号主体信息不一致”
  4. 【python执行cmd】返回值收藏
  5. Word 2003 视频教程-Word 字体大小(转)
  6. 用devc++表白_中山院表白墙丨电科大中山院的帅哥,不会走路吗?没事出来走两步给我瞧瞧...
  7. 字符串转数组java_Java实现数组转字符串及字符串转数组的方法分析
  8. 互联网保险市场规模持续上涨,元保保险发布权威报告公开数据
  9. java实现debounce_利用throttle和debounce实现延迟请求
  10. 微信开发者工具使用教程