当前位置: 首页 > news >正文

汉诺塔问题

目录

问题描述 

思路解析 

代码 


问题描述 

汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则:

  • 每次只能移动柱子最顶端的一个圆盘;
  • 每个柱子上,小圆盘永远要位于大圆盘之上;

思路解析 

比如现在有2个盘子,3个柱子A,B,C,目标是要把A上的盘子移动到C上,方法就是先把小的借助B移到B上,然后把A上的大的移到C上,然后把B上的盘子移到C上。

再比如现在有3个盘子,A,B,C三个柱子,同样把A上的盘子移到C上。

我们由此可以将问题拆解:

将A柱上的盘子看做2部分,一部分是最底下的那个盘子,另外一部分是n-1个盘子,我们要做的就是将n-1个盘子移到B上,把最后一个盘子移到C上;然后在把B上的n-1个盘子移到C上

同理对于B来说也是如此,此时B上也是两部分,一部分是第n-1个盘子,另外一部分是这(n-1)- 1个盘子,我们要做的是把(n-1)-1个盘子移到A上,然后把第n-1个盘子移到C上。最后把A上的(n-1)-1个盘子移到C上

然后依次往复,直到A,B上的盘子归零,盘子全放在C上。

即:第一步:移n-1个到临时柱

       第二步:移最大盘到目标柱  

       第三步:移n-1个到目标柱

我们现在的问题就是想去算n个盘子从A移到C上的次数,不难得出递归的两个条件

  • 限制条件:A柱子或者B柱子上的盘子数为1,当盘子数为1,肯定只需要移动1次即可。
  • 逼近条件:A柱子或者B柱子上的盘子每次都分为最后1个和其他个,即1与n-1,直到只剩1个盘子

代码 

由此我们可以得到代码:

我们也可以写一个显示出移动步骤的版本

http://www.dtcms.com/a/293242.html

相关文章:

  • 阿里Seata事务模式场景化选型指南
  • Java学习-------事务失效
  • 第二章 JS进阶 【5. Date(日期对象)】
  • 坑机介绍学习研究
  • Linux 使用 screen 窗口会话稳定挂载jar包到后台运行
  • 【图像认知与处理】OpenCV基础学习
  • 每日数据推荐:成都市AOI面数据
  • 疯狂星期四文案网第15天运营日记
  • 【langchain】3分钟构建一个上下文聊天机器人
  • 高可用架构模式——FMEA方法(排除架构可用性隐患的利器)
  • linux辅助知识(Shell 脚本编程)
  • Agent 工具箱:一步步搭建你的第一个 MCP 服务
  • day21-定时任务
  • Atcoder Beginner Contest 415 D题
  • Elasticsearch Java 8.x 的聚合 API 及子聚合的用法
  • (Python)类的练习与巩固(图书管理系统)(类与方法的基础教程)(if条件扩展)(动态类型)(Python教程)
  • RDLC报表纵向合并单元格
  • 适配者模式
  • git reset HEAD的实用指南
  • PyQt5—QLabel 学习笔记
  • Python通关秘籍(四)数据结构——列表
  • 发票识别在费控系统应用剖析
  • Linux 重定向和缓冲区
  • 1.两数之和
  • CDN 优化前端打包体积
  • Unity里的加力
  • Linux研学-MySQL安装
  • IP43半加固笔记本L156H
  • Embassy实战:Rust嵌入式异步开发指南
  • 使用docker(ubuntu)搭建web环境(php,apahce2)