JavaScript递归函数解“汉诺塔”算法代码解析


Posted in Javascript onJuly 05, 2018

“汉诺塔”是一个著名的益智游戏。塔上有3根柱子和一套直径各不相同的空心圆盘。开始时柱子上的所有圆盘都按照从小到大的顺序堆叠。目标是通过每次移动一个圆盘到另一根柱子,最终把一堆圆盘移动到目标柱子上,过程中不允许把交大的圆盘放置在较小的圆盘之上。

仔细解读这段话,如果有10个圆盘甚至更多,那操作步骤绝对多到让人震惊,但目标是把一堆圆盘移动到目标柱子上,如果把上面的9个圆盘看成一套,第10个圆盘看成另一套,先移动9个圆盘到另一根柱子上,再把上面8个圆盘看成一套,第9个圆盘看成另一套……依次类推,分解移动,递归函数的思想就体现出来了。

完成代码,非常简单的写法,不知道还有没有更简单的写法?

var hanoi = function {disc, begin, end, helper) {
 if (disc > 0) {
  hanoi(disc - 1, begin, helper, end);
  document.writeln('移动圆盘 ' + disc + ' 从 ' + begin + ' 到 ' + helper);
  hanoi(disc - 1, end, begin, helper);
 }
};
hanoi(3, '柱子一', '柱子二', '柱子三');

圆盘数量为3时的输出:

移动 1 从 柱子一 到 柱子三

移动 2 从 柱子一 到 柱子二

移动 1 从 柱子三 到 柱子二

移动 3 从 柱子一 到 柱子三

移动 1 从 柱子二 到 柱子一

移动 2 从 柱子二 到 柱子三

移动 1 从 柱子一 到 柱子三

传递给hanoi函数的参数包括当前移动的圆盘编号和它将要用到的3根柱子。当它调用资深的时候,它去处理当前正在处理的圆盘之上的圆盘。最终,它会以一个不存在的圆盘编号去调用。在这样的情况下,它不执行任何操作。由于该函数对非法值不予理会,也就不用担心会导致死循环。

总结

以上所述是小编给大家介绍的JavaScript递归函数解“汉诺塔”算法代码解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JavaScript Event学习第十一章 按键的检测
Feb 10 Javascript
2010年最佳jQuery插件整理
Dec 06 Javascript
自定义的一个简单时尚js下拉选择框
Nov 20 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
Dec 20 Javascript
探索angularjs+requirejs全面实现按需加载的套路
Feb 26 Javascript
JS判断字符串变量是否含有某个字串的实现方法
Jun 03 Javascript
原生JS封装animate运动框架的实例
Oct 12 Javascript
react-navigation 如何判断用户是否登录跳转到登录页的方法
Dec 01 Javascript
解决vue打包css文件中背景图片的路径问题
Sep 03 Javascript
vuejs点击class变化的实例
Sep 05 Javascript
Vue.js 图标选择组件实践详解
Dec 03 Javascript
jdk1.8+vue elementui实现多级菜单功能
Sep 24 Javascript
微信小程序开发之改变data中数组或对象的某一属性值
Jul 05 #Javascript
JavaScript实现京东购物放大镜和选项卡效果的方法分析
Jul 05 #Javascript
微信小程序实现左右联动的实战记录
Jul 05 #Javascript
vue实现自定义多选与单选的答题功能
Jul 05 #Javascript
JavaScript实现图片懒加载的方法分析
Jul 05 #Javascript
JavaScript实现浅拷贝与深拷贝的方法分析
Jul 05 #Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
Jul 05 #Javascript
You might like
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
原生js实现五子棋游戏
2020/05/28 Javascript
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
python django中8000端口被占用的解决
2019/12/17 Python
在jupyter notebook 添加 conda 环境的操作详解
2020/04/10 Python
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
皇家阿尔伯特英国官方商店:Royal Albert骨瓷
2019/03/25 全球购物
党员培训思想汇报
2014/01/07 职场文书
检察官就职演讲稿
2014/01/13 职场文书
C++程序员求职信
2014/05/07 职场文书
医院搬迁方案
2014/06/14 职场文书
创新社会管理心得体会
2014/09/12 职场文书
初中美术教学反思
2016/02/17 职场文书
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript