汉诺塔问题一直是研究递归算法的一个经典案例,也被很多教材当成递归算法的进阶案列,今天,我们就来看一下这个汉诺塔问题!

首先明白什么叫汉诺塔问题:

首先有三个柱子:分别是

起始柱子(最左边): source
辅助柱子(最右边): helper
目标柱子(中间): dest

柱子上有诺干个盘子,我们通过移动让左右的盘子从小到大的堆放在目标柱子上(中间柱子)

下面是移动的动作

然后我们需要做的就是,写一个算法,把每次移动的动作放在一个数组里面,让算法计算怎么移动能达成目标,先看一下结果

看着这个

数组,是不是就能很清晰的看到是怎么走的了?哪怕有100个盘子,也能很快的计算出怎么走,只要根据数组上面的步骤执行就可以了

清楚了我们的目标,接下来一块写代码吧

 我先把代码展示出来,然后再说明一下

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body></body>
<script>/** * @param {圆盘数:number} plates * @param {起始柱子 a:string} source * @param {辅助柱子 b:string} helper * @param {目标柱子 c:string} dest * @param {移动步骤集:Array,数组的长度就是移动的次数} moves */var move1 = []function hanoi(plates, source, helper, dest, moves = []) {if (plates <= 0) {return moves;}if (plates === 1) {moves.push([source, dest]);move1.push([source, dest, helper]);} else {hanoi(plates - 1, source, dest, helper, moves);moves.push([source, dest]);hanoi(plates - 1, helper, source, dest, moves);}return moves;}// testconsole.log(hanoi(5, 'source', 'helper', 'dest')); // 输出结果如下图展示
</script>
</html>

最难的是else里面的两次递归调用,这个不太好讲,我做了个图,帮助理解!

5层的汉诺塔太大了,不太好截图,我放个4层的,其实原理是一样的,

4层就是2的四次方-1,也就是15次;

5层就是2的5次方-1,得到31次;


这个不太好理解,也得花时间,我当时搞了一晚上,才画出的图,有兴趣的小伙伴可以私我,大家一块讨论,如果有不正确的地方,欢迎大家伙指导!

hanoi塔问题的详解(分治思想+递归)相关推荐

  1. Hanoi塔问题图文详解

    汉诺塔问题 [问题描述] 设A.B.C是3个塔座.开始时,在塔座A上有一叠共n个圆盘,这些圆盘自下而上,由小到大地叠放在一起.各圆盘从小到大的编号为1,2,-,n.现要求将塔座A上的这一叠圆盘移动到塔 ...

  2. 递归经典例题 --- 汉诺塔(图文详解)

    目录 一.介绍 二.游戏规则 三.玩法简介 四.算法分析 五.代码解析 六.源码 七.递归过程详解 一.介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵 ...

  3. 详解Clojure的递归(下)——相互递归和trampoline

    详解clojure递归(上)     详解clojure递归(下)         这篇blog拖到现在才写,如果再不写,估计就只有上篇没有下篇了,趁周末写一下. 上篇提到了Clojure仅支持有限的 ...

  4. 汉诺塔详解过程和递归思想及举例(python代码)

    省略问题描述- 但我们知道64个盘子的移动次数是18 446 744 073 709 551 615这是一个天文数字 解决办法: 我们最终解决的问题就是将a柱子原来由大到小从下到上排好序的圆盘通过b柱 ...

  5. 从背包问题优化详解动态规划思想

    动态规划: 所有的数据结构与算法的理解必须建立在题目的练习上,否则看多少理论都没有实际用处!!! 所以下面这些理论文字看不懂通通没关系,跟随下面的背包问题还会跟深入的理解. 一.基本概念:任何数学递推 ...

  6. java汉诺塔(含汉诺塔问题的详解)

    目录 一:汉诺塔问题 二:汉诺塔问题思路 三:图示化思路 四:代码展示 一:汉诺塔问题 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的 ...

  7. 汉诺塔代码图文详解(递归入门)

    游戏规则: 已知条件 存在A,B,C三根柱子,A上套有N片圆盘 (如下图) 目的 将A上的所有圆盘移到C上 约束条件 每次只能移动一片圆盘,且整个过程中只能出现小圆盘在大圆盘之上的情况 首先我们模拟( ...

  8. QuickSort简解(分治思想) By ACReaper

    快排又称为快速排序算法 快熟排序主要思想为:递归而分,重于分而治,而简与合. 治: int partition(int A[],int st,int ed){int key = A[st];//把第一 ...

  9. C语言汉诺塔问题图文详解

    设立三根柱子,pos1,pos2,pos3 要求将pos1柱子上的三个圆盘按照顺序移动到pos3柱子上,并且每次只能移动一个圆盘,移动过程中每个柱子上的圆盘都保持下大上小的顺序排列 当只有一个圆盘时, ...

最新文章

  1. Asp.net2.0下的大文件上传服务器控件
  2. WIN7安装及配置JDK
  3. python输出方格_Python蓝桥杯练习 剪格子
  4. 1.Lambda表达式(新手写的!新手写的!新手写的!)(未完成)
  5. 天气预报的Ajax效果
  6. 计算机图形学几何变换
  7. 风云的银光志Silverlight4.0教程之遍历访问客户端用户的本地文件
  8. 在Asp.net Mvc 3中使用swfupload
  9. [数据结构] 三十二叉堆
  10. keil注册机激活的方法
  11. html流特性,CSS深入理解流体特性和BFC特性下多栏自适应布局_html/css_WEB-ITnose
  12. 联盛德 HLK-W806 (十): 在 CDK IDE开发环境中使用WM-SDK-W806
  13. 夏普Sharp AR-M207 一体机驱动
  14. html5动态加载图片和加载视频
  15. [Huffman树] aw149. 荷马史诗(哈夫曼模型+贪心)
  16. 使用Windows Server 2003轻松建立森林间信任
  17. Kangle一键升级ENT商业版本
  18. React 源码学习
  19. 软件著作权到底享有哪些权利?
  20. [bzoj3131]淘金

热门文章

  1. php写入文本 记事本打开换行_php生成txt记事本文件换行问题
  2. 单行文本溢 和 多行文本溢出
  3. office爆破软件
  4. 数据校验-奇偶校验码/海明码/循环冗余码
  5. 【转】2018最新csdn修改博客皮肤模板教程
  6. 美图秀秀只会P图?涉猎行业广泛
  7. ScanNet数据集下载与导出颜色图、深度图、内参、位姿数据
  8. 别让奴隶心理捆住努力心理
  9. React基础第一天-jsx
  10. PostgreSQL索引类型