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

汉诺塔递归解决思路图解分析,python代码实现

目录

4.假设四层汉诺塔,n=4,利用整体思想分解为两层的情况

3.分解到n=3

3.1 分解上面n=4时第一个步骤:

3.2 分解上面n=4时第三个步骤:

2.继续分解到n=2 (同理略)

1.当分解到n=1

python代码


        问题:把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作

36c277b4219f4a638abe671c61a8d78d.png

   

         分治思想,将复杂问题分解,寻找规律。

        先不用细究张图,后面还会放一次。

b20e7be544ce4fbfa539a6256366cde8.jpeg

  4.假设四层汉诺塔,n=4,利用整体思想分解为两层的情况

41f9a48d191f4876beae8a0b3f9c1a8b.png

图1

         分解方法:上层三个(1,2,3)绿色部分当作一层和蓝色部分最下层(4),这下仅需考虑两层。

        目标:本轮n=4,此时我们的目标就是将A处(起始处start)盘子,按照规则(一次移动一个盘子(将绿色一体视为一个盘子),且小盘子不能放到大盘子下面)全部移动到C处(目的地destination),当然肯定要借助B处(中继处t)进行移动。

        记住,从n=4递归分解到n=1过程中, start、destination、t 跟A、B、C是相互独立的,我们仅从从哪里start,借助哪里t,到哪里destination这个视角考察问题,在这个过程中,A有可能是start也有可能是destination或t。

        因为最后面我们找出的规律就是start->t , start->destination, t->destination

        但只考虑两层时,步骤只有A->B、A->C、B->C,

        对应n=4时对start、destination、t和ABC的对应关系,!!!对应起来就是start->t , start->destination, t->destination.

ee01f653e5aa4483a42c017954228ef1.png

 图2

        图2中,红字部分出现的start和destination是作为下一轮即n-1轮分解的start和destination,但是在本轮B只是中继t,下面的分解同理。 

        然后,n=4时第一第三个步骤,实际上都需要将三层的盘子移动到别处(第一个步骤需要移动到B、第三个步骤需要移动到C),所以还需继续分解,第一第三个步骤都需要分解。

        此时最底下最大的盘子已经在C最下边了,因此无论今后怎么移动其它盘子,只会比这个盘子小,因此,不需要再考虑它,可以当他不存在了。

3.分解到n=3

3.1 分解上面n=4时第一个步骤:

        此时分解到n=3 。

        分解方法:将三层的盘子,上两层作为一体,下面那层作为一层,这样也是化为两层移动的问题。

        目标:此时我们的目标就是将A处(起始处start)盘子,按照规则(一次移动一个盘子,且小盘子不能放到大盘子下面)全部移动到B处(目的地destination),当然肯定要借助C处(中继处t)进行移动。

7d8dad4163ca42439c65dcc13e19b804.png

         很巧的是,对应n=3时对start、destination、t和ABC的对应关系,!!!对应起来就是start->t , start->destination, t->destination.这个关系不变,这就是规律。

5130647f2ba1444c886c1c3f1e35bb5c.png

3.2 分解上面n=4时第三个步骤:

        此时仍然还是n=3 。

        分解方法:同理将三层的盘子,上两层作为一体,下面那层作为一层,这样也是化为两层移动的问题。

        目标:此时我们的目标就是将B处(起始处start)盘子,按照规则(一次移动一个盘子,且小盘子不能放到大盘子下面)全部移动到C处(目的地destination),当然肯定要借助A(中继处t)进行移动。

7d8dad4163ca42439c65dcc13e19b804.png

 同理,对应起来还是start->t , start->destination, t->destination.这个关系不变

b2843e0d89f546bba3b905da7cfb8355.png

2.继续分解到n=2 (同理略)

1.当分解到n=1

        n=1 此时分解到了尽头,可以作为求解问题的结束判断。 

        n=2分解时,一次仅需移动一块,实际上也仅需要移动一块,其移动步骤如A->B就不需要分解了,就相当于n=1

06e58bcb8afa46adae4b34d84693b32c.jpeg

python代码

'''
参数1:本次调用是解决几层汉诺塔问题
参数2:希望汉诺塔从哪里
参数3:搬到哪里
参数4: 途中借助那个位置作为中继
'''
def hn(n,start,destination,t):# 结束判断,分解到1时结束    # 为什么不是n==2结束,当n==2时,是刚n==3分解完递归到n==2,此时n==2轮递归还没有开始。if n==1:print(start+'->'+destination+'\n')return # 分解到n-1,借助找到的规律,start->t、start->destination、t->destination# 为什么还要传入t,因为此时的t有可能是下一轮分解的start或destinationhn(n-1,start,t,destination) print(start+'->'+destination+'\n')hn(n-1,t,destination,start)hn(4,'A','C','B')

 参考博主:

汉诺塔(Hanoi)问题归纳总结_hanoi塔问题-CSDN博客

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • OceanbaseV4模拟题解析
  • Spring Bean 作用域
  • Graylog配置用户权限以及常用搜索语法
  • HTML5 为什么只需要写 <!DOCTYPE HTML>
  • Sql查询优化--索引设计与sql优化(包含慢查询定位+explain解释计划+左匹配原则+索引失效)
  • [pytorch] --- pytorch基础之tensorboard使用
  • Vue 登录状态判断与跳转指南
  • 一.海量数据实时分析-Doris入门和安装
  • JMeter之上传文件同时带有参数
  • Python计算机视觉四章-照相机模型与增强现实
  • Spring Cloud全解析:网关之GateWay过滤器
  • RASA使用长文记录以及一些bug整理
  • 鸿蒙启动框架配置文件(StartUpTask)
  • 学习记录:js算法(二十一):字符串的排列、替换后的最长重复字符
  • YOLOv9改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Asm.js的简单介绍
  • Bootstrap JS插件Alert源码分析
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Leetcode 27 Remove Element
  • Markdown 语法简单说明
  • PHP 7 修改了什么呢 -- 2
  • springboot_database项目介绍
  • Web Storage相关
  • webpack4 一点通
  • 动态规划入门(以爬楼梯为例)
  • ------- 计算机网络基础
  • 警报:线上事故之CountDownLatch的威力
  • 开源SQL-on-Hadoop系统一览
  • 世界上最简单的无等待算法(getAndIncrement)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一些css基础学习笔记
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 责任链模式的两种实现
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • #数据结构 笔记一
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (1)(1.9) MSP (version 4.2)
  • (11)MATLAB PCA+SVM 人脸识别
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (回溯) LeetCode 46. 全排列
  • (离散数学)逻辑连接词
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (循环依赖问题)学习spring的第九天
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (状压dp)uva 10817 Headmaster's Headache
  • **CI中自动类加载的用法总结
  • .net core控制台应用程序初识
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET设计模式(8):适配器模式(Adapter Pattern)