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的caller,callee,call,apply
Apr 28 Javascript
js 绑定带参数的事件以及手动触发事件
Apr 27 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
Jan 04 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
Jun 08 Javascript
javascript制作2048游戏
Mar 30 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
Oct 14 Javascript
JavaScript数据绑定实现一个简单的 MVVM 库
Apr 08 Javascript
jQuery实现的放大镜效果示例
Sep 13 Javascript
基于layui数据表格以及传数据的方式
Aug 19 Javascript
关于vue编译版本引入的问题的解决
Sep 17 Javascript
Vue学习之axios的使用方法实例分析
Jan 06 Javascript
JavaScript多种图形实现代码实例
Jun 28 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如何解决网站大流量与高并发的问题
2011/06/25 PHP
Yii使用技巧大汇总
2015/12/29 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
一句话JavaScript表单验证代码
2009/08/02 Javascript
jQuery实现图片放大预览实现原理及代码
2013/09/12 Javascript
js封装可使用的构造函数继承用法分析
2015/01/28 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
2015/06/10 Javascript
浅析BootStrap栅格系统
2016/06/07 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
Vue-router结合transition实现app前进后退动画切换效果的实例
2017/10/11 Javascript
微信小程序 冒泡事件原理解析
2019/09/27 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
Python利用正则表达式匹配并截取指定子串及去重的方法
2015/07/30 Python
Python数据类型学习笔记
2016/01/13 Python
使用Kivy将python程序打包为apk文件
2017/07/29 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
PyQt5 对图片进行缩放的实例
2019/06/18 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
python+pygame实现坦克大战
2019/09/10 Python
python getpass实现密文实例详解
2019/09/24 Python
python 用户交互输入input的4种用法详解
2019/09/24 Python
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
网络程序员自荐信
2014/01/25 职场文书
农村婚礼主持词
2014/03/13 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
讲文明倡议书
2015/04/29 职场文书
农业项目合作意向书
2015/05/08 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP
python 离散点图画法的实现
2022/04/01 Python