汉诺塔也是经典的算法问题

文章目录

  • 1 汉诺塔问题

1 汉诺塔问题

法国数学家卢卡斯(Edouard Lucas)在1883年提出了一个数学游戏:

  • 传说在世界中心贝拿勒斯(印度北部)的圣庙里,一块黄铜板上有三根宝石柱。印度教的主神大梵天在创造世界的时候,在其中一根柱上从下到上地穿好了由大到小的64片金盘。大梵天命令僧侣们将圆盘从下面开始按大小顺序重新摆放在另一根柱子上,并且规定, 在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。预言说当这些盘子移动完毕时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

考虑该问题的一般形式:有 n 个圆盘,最初自下而上、自大而小地穿在A柱上, 每次按规则(上述)移动一个圆盘,最终将所有圆盘移动到C柱上。

假如现在有如下图的盘子:

则一共需要移动7次。自己手动画画就知道了。

那么现在盘子有n个,如下图:


该如何移动?实际上这是递归的问题(递归在后面的学习中会学到)

  • 先将A柱上所有其他盘子移到B柱上(这是一个类似于自己的子问题),只留下最下面的盘子,也就是n盘子
  • 接着将最大的盘子从A柱移到C柱,之后不必再管它。
  • 最后再将刚才移到B柱上的盘子移到C柱上(这又是一个子问题) 。

用 T(n) 表示移动 n 个圆盘所需要的步数

根据算法

  1. 先把前面 n-1 个盘子转移到B上;
  2. 然后把第 n 个盘子转到C上(n这个盘子移动了一次);
  3. 最后再次将B上的 n-1 个盘子转移到C上(这n-1个盘子移动了两次)
  • 得到递推关系 T(n)=2T(n-1)+1

这个公式,足以使用递归的形式写出代码。下面还可以直接求出具体的值:

使用倒推法求解T(n)=2T(n-1)+1, T(1)=1:

回到最初的汉诺塔问题, 要将64片金盘重新摆放在另一根柱子上, 最少需要 264-1 步, 即使僧侣每秒钟移动一步而且每次移动都是正确的方法, 那么也需要 5.8*1011 年, 即5千多亿年!

【离散数学中的数据结构与算法】十 汉诺塔相关推荐

  1. 用java编写汉诺塔问题_数据结构与算法之汉诺塔问题(Java递归)

    汉诺塔问题: 有三根柱子,源杆A,暂存杆temp,目的杆C A上有n层盘子,由小到大向下排列,现需要将A杆的盘子移到C杆中 要求:1)大的盘在下面,小的盘在上面 2)一次只能移动一个盘子 个人思路:先 ...

  2. 数据结构与算法_汉诺塔

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

  3. 【离散数学中的数据结构与算法】六 排列与组合二

    接着上一篇学习:[离散数学中的数据结构与算法]五 排列与组合一 上一篇文章主要学习了可重复选取的可重排列和不可重复选取的排列.他们都是在n个不同的对象中选取. 今天我们俩学习的是,当这个n个对象中有相 ...

  4. 【Java数据结构与算法】第十七章 二分查找(非递归)和分治算法(汉诺塔)

    第十七章 二分查找(非递归)和分治算法(汉诺塔) 文章目录 第十七章 二分查找(非递归)和分治算法(汉诺塔) 一.二分查找 1.思路 2.代码实现 二.分治算法(汉诺塔) 1.概述 2.汉诺塔 一.二 ...

  5. 经典算法之汉诺塔求解问题

    法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64 ...

  6. 程序设计与算法----递归汉诺塔问题

    汉诺塔 古代有一个梵塔,塔内有三个座A,B,C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移动到C座,但每次只能允许移动一个盘子,并且在移动的过程中 ...

  7. 算法笔记 —— 汉诺塔详解

    文章目录 一.问题来源 二.小游戏体验 三.思路分析 四. 程序实现 一.问题来源 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号X.Y.Z),在 ...

  8. 用python递归的算法解决汉诺塔问题

    关于递归的四条基准法则 基准情形: 必须由某些基准情形,它无需递归就能解出 不断推进: 对于那些需要递归的情形,每一次递归调用都必须要使求解的状况朝接近基准情形的方向推进 设计法则: 假设所有的递归调 ...

  9. 分治算法求解汉诺塔问题

    1.什么是分治算法? 分治算法,字面理解"分而治之",就是把一个复杂的问题分成两个或者更多的相同或者相似的子问题,再把子问题分成更小的子问题...直到最后子问题可以直接简单求解,原 ...

最新文章

  1. 使用angular5+ionic3+sqlite创建离线app应用
  2. 剑指Offer(Java实现)扑克牌顺子
  3. 数据如何导入oracle数据库,如何用Oracle导入导出工具来实现Oracle数据库移植?
  4. 问题 D: 约数的个数
  5. expdp impdp中 exclude/include 的使用
  6. 什么叫pin脚的pad_为什么特小尺寸液晶屏价格比较高
  7. mybatisplus坑 insert标签insert into select无参数问题
  8. python 列表推导式
  9. 数字图像处理--图像梯度算子的本质
  10. UOJ424 Count 生成函数、多项式求逆、矩阵快速幂
  11. 一篇文章带你详解 HTTP 协议(网络协议篇一)
  12. FPGA入门例程:LED
  13. Spring系列04德鲁伊连接池配置
  14. Html静态页面缓存问题,解决缓存更新不及时需清空缓存更新页面
  15. 【阿里云·云原生架构·白皮书】保姆级解读 一、 云原生架构定义
  16. idea java: 错误: 不支持发行版本 17
  17. layui登陆验证页面模板(滑块学习)
  18. 激光雷达学习笔记(一)数据采集
  19. 分析师Willy Woo:最近BTC买入是由长期持有者推动的,这次暴涨远未结束
  20. 制作视频画中画的方法

热门文章

  1. mybatis学习(13): 连接数据库之前的准备(测试连接)
  2. 5如何让进行项目管理
  3. 46什么是session
  4. 玩转oracle 11g(49):监听服务设置开机自启,不用一直配置监听
  5. Python sqrt() 函数
  6. Qt多线程编程的主要线程类
  7. finereport 格式化金额函数_帆软报表(finereport)常用函数
  8. 软件工程概论个人作业02(四则运算2)
  9. 关于单片机串口发送和接收的问题
  10. UVA 11557 - Code Theft (KMP + HASH)