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 进阶篇2 CSS XML学习
Mar 14 Javascript
JS获取浏览器版本及名称实现函数
Apr 02 Javascript
jquery动态添加删除(tr/td)
Feb 09 Javascript
使用three.js 画渐变的直线
Jun 05 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
Mar 30 Javascript
jQuery Masonry瀑布流布局神器使用详解
May 25 jQuery
React Native中TabBarIOS的简单使用方法示例
Oct 13 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
Jun 05 Javascript
IE11下处理Promise及Vue的单项数据流问题
Jul 24 Javascript
JS数组方法shift()、unshift()用法实例分析
Jan 18 Javascript
Vue实现腾讯云点播视频上传功能的实现代码
Aug 17 Javascript
小程序自定义弹框效果
Nov 16 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中一个控制字符串输出的函数
2006/10/09 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
javascript实现动态CSS换肤技术的脚本
2007/06/29 Javascript
对象特征检测法判断浏览器对javascript对象的支持
2009/07/25 Javascript
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
js实现图片无缝滚动
2015/12/23 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
JS优化与惰性载入函数实例分析
2017/04/06 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
[02:54]DOTA2英雄基础教程 暗影牧师戴泽
2013/12/05 DOTA
python 禁止函数修改列表的实现方法
2017/08/03 Python
python实现连连看辅助之图像识别延伸
2019/07/17 Python
python绘制规则网络图形实例
2019/12/09 Python
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
介绍一些UNIX常用简单命令
2014/11/11 面试题
人力资源主管岗位职责
2014/01/29 职场文书
《临死前的严监生》教学反思
2014/02/13 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
2014年部门工作总结
2014/11/12 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
政工师工作总结2015
2015/05/26 职场文书
高考1977观后感
2015/06/04 职场文书
同意转租证明
2015/06/24 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
解决Pytorch中关于model.eval的问题
2021/05/22 Python
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js