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根柱子。当它调用资深的时候,它去处理当前正在处理的圆盘之上的圆盘。最终,它会以一个不存在的圆盘编号去调用。在这样的情况下,它不执行任何操作。由于该函数对非法值不予理会,也就不用担心会导致死循环。

原文地址:https://www.cnblogs.com/undezhi/p/9266593.html

时间: 2024-10-18 03:44:34

JavaScript递归函数解“汉诺塔”的相关文章

Python算法 - 递归精解 - 汉诺塔问题

汉诺塔问题 题意 将A 柱子上的块转移到 C 上 条件1  -  每次只能转移一块 条件2  -  大块不能压小快 解析 概念原理 冰箱装大象问题 : 1. 打开冰箱 2. 放入大象 3. 关上冰箱 类比在 任何一个块 n 来说: 1. 把上面的块都移动好 2. n 块移动过去 3. 之前上面的块在放在 n 块上面 简化问题, 考虑 123块的移动, 可以考虑成我想移动 3 . 必然要移动12 同理 我想移动 2, 必然要移动 1 , 即关系为 f(3) ---> f(2) ---> f(1)

python练习-递归函数实现汉诺塔搬迁问题

def move(n,a='A',b='B',c='C'): if n==1: print('move',a,'to',c) else: move(n-1,a,c,b)#将A上的n-1块通过c搬运到b上 print('move',a,'to',c)#将A最下面的那一块搬到C上 move(n-1,b,a,c)#将b的n-1块通过a搬到c上,结束 输入: move(10),运行结果如下:

python第二天:递归函数(汉诺塔)

1 #hanoi.py 2 def hanoi(n,x,y,z): 3 if n==1: 4 print(x,"-->",z) 5 else: 6 hanoi(n-1,x,z,y) 7 print(x,"-->",z) 8 hanoi(n-1,y,x,z) 9 hanoi(2,"X","Y","Z") 10 print("----------") 11 hanoi(3,&qu

汉诺塔递归

#一日一词# 今天在学习Python的时候,遇到了递归问题,案例呢就是经典的汉诺塔游戏,表示虽然以前就接触过这游戏,解起来也很容易,不过放在编程里,几行的代码可够我手推了一个多小时.╭∩╮(︶︿︶)╭∩╮ 当然也是感受到了搞清楚一个(我认为的)难题的乐趣,心情大好,买条裤子. (表示从晚上一直整理到第二天,电脑没电所以今早发,生日与学习紧密结合)? 首先说下汉诺塔游戏,如下图,需要利用中间的柱子将左边的所有圆盘移动到最右边的柱子上,且和原来的大小上下顺序一致,移动过程中保证大盘永远在小盘下面.

递归函数 汉诺塔

#include<stdio.h>//递归函数,汉诺塔void hanoi(int n,char c1,char c2,char c3);void move(char x,char y);int main(){ int i; printf("move n dishes for A to C,n="); scanf("%d",&i); hanoi(i,'A','B','C'); return 0;}void hanoi(int n,char c1,

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

在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. http://hightopo.com/demo/hanoi_20151106/index.html 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Tower_of_Hanoi. 知道了汉诺塔的规则和算法,现在就开始创建元素.用HT for Web(http://www.hightopo.com)现有的3D模板创建底盘和3根柱子不是问题,问题是要创建若

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

在这里我们将构造一个基于HT for Web的HTML5+JavaScript来实现汉诺塔游戏. 汉诺塔的游戏规则及递归算法分析请参考http://en.wikipedia.org/wiki/Tower_of_Hanoi. 知道了汉诺塔的规则和算法,现在就开始创建元素.用HT for Web(http://www.hightopo.com)现有的3D模板创建底盘和3根柱子不是问题,问题是要创建若干个中空的圆盘.一开始的想法是:创建一个圆柱体,将圆柱体的上下两端隐藏,设置柱面的宽度来实现圆盘的效果

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

百度测试部2015年10月份的面试题之——汉诺塔. 汉诺塔就是将一摞盘子从一个塔转移到另一个塔的游戏,中间有一个用来过度盘子的辅助塔. 百度百科在此. 游戏试玩在此. 用递归的思想解决汉诺塔问题就是分为两种情况: 第一种情况是只有一个盘子的情况,也就是最基本的情况,这种情况下,直接将该盘子从原始塔转移到目标塔即可胜利: 第二种情况是右n个盘子的情况,也就是普遍情况,这种情况下,要将除了最底下的那个盘子以外的(n-1)个盘子从原始塔转移到辅助塔,再把最底下的那个盘子(第n个盘子)从原始塔转移到目标

【数据结构与算法】递归汉诺塔

汉诺塔 汉诺塔是根据一个传说形成的数学问题(关于汉诺塔): 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘: 大盘不能叠在小盘上面. 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则. 递归汉诺塔 解题思路: 可以把问题简化成2个盘子的情况,如:A上有两个盘子,B和C是空的.如果要把A的两个盘子全部移动到C,需要经过以下步骤: 1.A移动一个盘子到B 2.A移动一个盘