“汉诺塔”是一个著名的益智游戏。塔上有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递归函数解“汉诺塔”的更多相关文章

  1. PHP实现的解汉诺塔问题算法示例

    问题描述: 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到小按顺序放置64个金盘(如下图).游戏的目标:把A杆 ...

  2. python:递归函数(汉诺塔)

    #hanoi.py def hanoi(n,x,y,z): if n==1: print(x,"-->",z) else: hanoi(n-1,x,z,y) print(x, ...

  3. 基于HTML5的WebGL设计汉诺塔3D游戏

    在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. http://hightopo.com/demo/hanoi_20151106/index.html ...

  4. HT for Web 3D游戏设计设计--汉诺塔(Towers of Hanoi)

    在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Towe ...

  5. C#中汉诺塔问题的递归解法

    百度测试部2015年10月份的面试题之——汉诺塔. 汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔. 百度百科在此. 游戏试玩在此. 用递归的思想解决汉诺塔问题就是分 ...

  6. 汉诺塔I && II

    汉诺塔I 题目链接:https://www.nowcoder.com/questionTerminal/7d6cab7d435048c4b05251bf44e9f185 题目大意: 略 分析: 利用汉 ...

  7. 从"汉诺塔"经典递归到JS递归函数

    前言 参考<JavaScript语言精粹> 递归是一种强大的编程技术,他把一个问题分解为一组相似的子问题,每一问题都用一个寻常解去解决.递归函数就是会直接或者间接调用自身的一种函数,一般来 ...

  8. javascript实现汉诺塔动画效果

    javascript实现汉诺塔动画效果 当初以为不用html5也很简单,踩了javascript单线程的大坑后终于做出来了,没事可以研究下,对理解javascript的执行过程还是很有帮助的,代码很烂 ...

  9. what' the python之递归函数、二分算法与汉诺塔游戏

    what's the 递归? 递归函数的定义:在函数里可以再调用函数,如果这个调用的函数是函数本身,那么就形成了一个递归函数. 递归的最大深度为997,这个是程序强制定义的,997完全可以满足一般情况 ...

随机推荐

  1. java8---lambda表达式

    语法糖 lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块).Lambda表 ...

  2. GIt -- git push 远程分支老是需要重新输入公钥密码问题处理?

     步骤: 先查看远程有哪些分支 删除远程分支,重新关联远程分支 最后再git push 到远程分支 git remote -v git remote rm RedisNote git remote a ...

  3. layui table 内容为select隐藏问题

    <style> .layui-table-cell,.layui-form,.layui-table-box,.layui-table-body{ overflow: visible; } ...

  4. Ext z自写checkbox

    软件弹出框Exr.window里面有许多个CheckBox,用ext自带的CheckBoxGroup也可以实现,但是在后期处理的时候远没有自写的CheckBox灵活,还出了一些莫名其妙的bug 忍无可 ...

  5. 高可用Redis(五):瑞士军刀之慢查询,Pipeline和发布订阅

    1.慢查询 1.1 慢查询的生命周期 步骤一:client通过网络向Redis发送一条命令 步骤二:由于Redis是单线程应用,可以把Redis想像成一个队列,client执行的所有命令都在排队等着s ...

  6. SVG初尝试之path

    命令汇总 命令基本规律 移动和直线命令 弧线命令

  7. vertx.FileResolver文件解析

    FileResolver Class //文件复制解析,复制文件到cache directory 中 ,VM options : -Dvertx.disableFileCPResolving publ ...

  8. swoole 版本查看

    php --ri swoole php --ri swoole | grep Version  查看swoole版本 php -m | grep swoole  查看swoole拓展是否安装成功(ph ...

  9. wxpy使用

    一 简介 wxpy基于itchat,使用了 Web 微信的通讯协议,,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展.实现了微信登录.收发消息.搜索好友.数据统计等功能. 总而言之,可用来实 ...

  10. 用spark-submit启动程序

    来源:http://spark.apache.org/docs/latest/submitting-applications.html 提交程序常用的一些选项 ./bin/spark-submit \ ...