JavaScript递归函数解“汉诺塔”算法代码解析
“汉诺塔”是一个著名的益智游戏。塔上有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根柱子。当它调用资深的时候,它去处理当前正在处理的圆盘之上的圆盘。最终,它会以一个不存在的圆盘编号去调用。在这样的情况下,它不执行任何操作。由于该函数对非法值不予理会,也就不用担心会导致死循环。
总结
相关推荐
shawsun 2020-03-01
蜗牛慢爬的李成广 2020-04-07
ericxieforever 2020-03-28
蜗牛慢爬的李成广 2019-12-08
HLW0 2012-02-01
sxyyu 2019-07-01
LITElric 2019-07-01
wangxiaohua 2010-05-30
wuxiaosi0 2019-03-13
cyjsky 2017-05-20
jiayuqicz 2018-04-18
yancey木易的blog 2018-03-19
tiewen 2019-02-18
BlowfishKing 2015-04-21
HTML学堂码匠 2016-05-17
danwenxuan 2014-07-23
jiayuqicz 2018-09-27
不羈 2008-05-02