递归算法之汉诺塔的实现
一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的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
递归算法之汉诺塔的实现相关推荐
- 基于非递归算法的汉诺塔游戏之Python实现
本文代码涉及到汉诺塔问题的非递归算法,可能不是很好理解,我在代码中加了大量注释,希望能够有所帮助,如果实在难以理解的话,请搜索这个算法并结合下面的代码进行阅读和理解.感谢国防科技大学刘万伟老师提供算法 ...
- 数据结构之递归算法解决汉诺塔问题
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...
- 递归算法之汉诺塔问题
问题叙述 故事背景: 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上 ...
- 算法与程序设计递归算法理解——汉诺塔
目录 1.理解汉诺塔问题可以先从下面两点入手 2.列出一到四层汉诺塔移动顺序寻找规律 3.将移动顺序用树状图来表示 4.将树状图转化为程序实现 1.理解汉诺塔问题可以先从下面两点入手 根据汉诺塔移动规 ...
- 递归算法 —— Hanoi汉诺塔游戏
前言 博客主页:干脆面la的主页 gitte链接:干脆面la的gitee仓库 刚学习完递归函数接触汉诺塔问题的时候,汉诺塔问题困扰了我很久.博主花了很长时间理解这道题目,因此整理出了用递归解决汉诺塔问 ...
- python每日算法 | 算法的起步与递归算法(汉诺塔问题)
创作不易,来了的客官点点关注,收藏,订阅一键三连❤
- python 利用递归算法来完成计算乘阶、斐波那契数列、汉诺塔
一.求一个整数的阶乘: 1.常用的迭代方法写法: def jc(n):result = nfor i in range(1, n):result *= ireturn resultnu = int(i ...
- 使用Python查看汉诺塔移动详细过程
汉诺塔属于比较经典的问题,详见以前的文章Python模拟汉诺塔问题移动盘子的过程,基于非递归算法的汉诺塔游戏之Python实现. 本文代码功能:模拟移动汉诺塔上的盘子,并实时显示3根柱子上盘子的情况. ...
- 汉诺塔详解(超详细)
递归算法求汉诺塔(C语言版) 汉诺塔: 梵天创造世界的时候做了三根金刚石柱子,x y z三根柱子 在x柱子上 从上往下按照从小到大顺序摞着64片黄金圆盘. 梵天命令婆罗门把圆盘从x柱移到z柱 并且规定 ...
最新文章
- 实用手册|史上最全的Pycharm快捷键操作
- 小鹏汽车招股书,满是智能技术自研的标签
- 阿里敏捷实践| 4个迭代,从批量交付向持续交付转型 1
- ECharts Tooltip
- 学计算机对显卡要求大吗,【5人回答】学AE的电脑配置要求高吗?需要什么样的电脑配置-3D溜溜网...
- Java修炼之道--I/O
- SAP License:跨行如何转入SAP
- android 打包成多个so,Android Studio打包.so库到apk中实例详解
- python篇 006-- pycharm vsc 编写python(对比浅析混合使用) pycharm篇
- 分布式系统的SLA如何定义
- java中宏定义,宏定义的使用
- 基于胜任力模型为集团企业构建动态信息安全培训课程体系
- CSP初赛基础知识整理
- 一个故事弄懂域名解析
- c语言-选手评分系统
- log4j2 pattern详解
- Activity 边边角角
- HCIP之排障(三)ISIS故障排除
- Robust Network Traffic Classification
- 帧间预测(三)symmetric MVD mode
热门文章
- Vue-nginx反向代理
- 天气API Http接口
- 申请微信小游戏流量主提示 “填写的姓名或身份证与公众号主体信息不一致”
- 【python执行cmd】返回值收藏
- Word 2003 视频教程-Word 字体大小(转)
- 用devc++表白_中山院表白墙丨电科大中山院的帅哥,不会走路吗?没事出来走两步给我瞧瞧...
- 字符串转数组java_Java实现数组转字符串及字符串转数组的方法分析
- 互联网保险市场规模持续上涨,元保保险发布权威报告公开数据
- java实现debounce_利用throttle和debounce实现延迟请求
- 微信开发者工具使用教程