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

news2024/12/24 2:30:08

目录

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或destination
    hn(n-1,start,t,destination) 
    print(start+'->'+destination+'\n')
    hn(n-1,t,destination,start)
    
hn(4,'A','C','B')

 参考博主:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087328.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】升级OpenSSH版本规避远程代码执行漏洞

本文首发于 ❄️慕雪的寒舍 升级OpenSSH版本规避远程代码执行漏洞。 说明 今天早上逛别人的博客的时候看到了这个重磅消息。OpenSSH爆出能远程通过root身份执行任意代码的漏洞&#xff0c;影响版本是 8.5p1 < OpenSSH < 9.8p1&#xff0c;奇安信的报告可以点我查看。 上…

计算机三级网络第4套练习记背

计算机三级网络第4套练习记背

全志/RK安卓屏一体机:医疗自助服务终端,支持鸿蒙国产化

医疗自助服务终端 为了解决传统医疗模式下的“看病难、看病慢”等问题&#xff0c;提高医疗品质、效率与效益&#xff0c;自助服务业务的推广成为智慧医疗领域实现信息化建设、高效运作的重要环节。 医疗自助服务终端是智慧医疗应用场景中最常见的智能设备之一&#xff0c;它通…

Linux学习笔记(4)----Debian压力测试方法

使用命令行终端压力测试需要两个实用工具&#xff1a;s-tui和stress sudo apt install s-tui stress 安装完成后&#xff0c;在终端中启动 s-tui实用工具&#xff1a; s-tui 执行后如下图&#xff1a; 你可以使用鼠标或键盘箭头键浏览菜单&#xff0c;然后点击“压力选项(Str…

day44.动态规划

718.最长重复子数组 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 思路:1.确定dp数组&#xff08;dp table&#xff09;以及下标的含义: dp[i][j] &#xff1a;以下标i - 1为结尾的A&#xff0c;和以下标j - 1为结尾的B&…

【论文速读】|RO-SVD:一种用于 AIGC 应用的可重构硬件版权保护框架

本次分享论文&#xff1a;RO-SVD: A Reconfigurable Hardware Copyright Protection Framework for AIGC Applications 基本信息 原文作者&#xff1a;Zhuoheng Ran, Muhammad A.A. Abdelgawad, Zekai Zhang, Ray C.C. Cheung, Hong Yan 作者单位&#xff1a;香港城市大学电…

linux 内核代码学习(七)

linux内核代码的研究中断了一段时间了&#xff0c;现在又重新开始了研究&#xff0c;个人觉得linux内核的学习是没有上限的&#xff0c;总是一个温故而知新的过程&#xff0c;是一个不断积累的过程。首先还是要先搭建一个方便自己学习和研究的平台&#xff0c;经过不断的尝试&a…

Java的IO模型详解-BIO,NIO,AIO

一、BIO相关知识 Java 的 BIO (Blocking I/O) 模型是基于传统的同步阻塞 I/O 操作。在这种模型中&#xff0c;每个客户端连接都需要一个独立的线程来处理请求。当线程正在执行 I/O 操作时&#xff08;如读取或写入&#xff09;&#xff0c;它会被阻塞&#xff0c;直到操作完成…

三级_网络技术_55_应用题

一、 请根据下图所示网络结构回答下列问题。 1.填写RG的路由表项。 目的网络/掩码长度输出端口__________S0&#xff08;直接连接&#xff09;__________S1&#xff08;直接连接&#xff09;__________S0__________S1__________S0__________S1 (2)在不改变路由表项的前提下&…

django学习入门系列之第十点《案例 用户登录》

文章目录 案例 用户登录安全认证django中的隐藏值获得用户账户密码空值 往期回顾 案例 用户登录 安全认证 ​ 如果提交数据后&#xff0c;发现并没有跳转到自己想要的界面&#xff0c;是因为django比Flask多一层 ”安全机制“ 的东西 解决方法&#xff1a; {% csrf_token %…

使用maven搭建微服务框架

徒手搭建cloud 1.认准SpringBoot,SpringCloud,SpringCloudAlibaba版本之间的对用关系 官网给出了声明&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki 2.选择好版本之后 spring bootspring cloudspring cloud alibaba2.3.12.RELEASEHoxton.SR102.2.5.REL…

Ps:工具预设面板

Ps菜单&#xff1a;窗口/工具预设 Window/Tool Presets 工具预设 Tool Presets面板可以为 Photoshop 的图像编辑工作带来极大的便利。 定义好相关的工具预设后&#xff0c;可以直接调用&#xff0c;而不管现在处于什么工具或什么样的参数状态&#xff0c;省去了再次设置参数的麻…

使用 树莓派3B+ 对日本葡萄园进行经济实惠的环境监测

对于 菊岛邦夫—Vineyard Kikushima 而言&#xff0c;Raspberry Pi 生态系统提供了支持和信息&#xff0c;通过基于温度和湿度监测的有针对性的最低限度杀虫剂方案&#xff0c;来提高葡萄的健康产量。 Vineyard Kikushima&#xff1a;http://vykikushima.greater.jp/vineyards…

finalshell 用 root 账号连接 ubuntu

我们平时在操作 linux 系统时&#xff0c;经常需要上传文件&#xff0c;修改文件&#xff0c;普通账号只能通过 vim 等工具修改&#xff0c;诸多不便。为了实现跟 windows 一样&#xff0c;双击直接编辑保存&#xff0c;需要下面步骤。 1. ubuntu 安装 ssh 1.1 安装 SHH 服务…

LuaJit分析(十)luajit自定义修改

通过分析luajit字节码文件格式可知&#xff0c;luajit文件由文件头和原型数组组成&#xff0c;而原型又包括原型头和原型体&#xff0c;文件头中包含了字节码文件的一些关键信息&#xff0c;目前的反编译工具根据标准的luajit2.0文件格式解析文件&#xff0c;如果对字节码文件的…

[Algorithm][综合训练][哈夫曼编码][abb][旋转字符串]详细讲解

目录 1.哈夫曼编码1.题目链接2.算法原理详解 && 代码实现 2.abb1.题目链接2.算法原理详解 && 代码实现 3.旋转字符串1.题目链接2.算法原理详解 && 代码实现 1.哈夫曼编码 1.题目链接 哈夫曼编码 2.算法原理详解 && 代码实现 哈夫曼编码&…

Linux系统应用(3)——编辑器vim

个人内容简介&#xff1a; &#x1f343;个人主页&#xff1a;诉清风2023 &#x1f388;逆转时间的公式&#xff0c;就是珍惜现在ദ്ദി˶&#xff70;̀֊&#xff70;́ ) ✧ 目录 个人内容简介&#xff1a; &#x1f388;逆转时间的公式&#xff0c;就是珍惜现在ദ്ദ…

junit格式报告解析工具

前言 在测试过程中&#xff0c;使用unittest或者pytest等主流框架&#xff0c;都可以生成junit格式的测试报告。当然也可以生成html格式的报告。但是为了自定义自己的测试报告&#xff0c;我开发了一款web网页工具&#xff0c;使用该工具上传junit格式的xml报告&#xff0c;可…

[Algorithm][综合训练][奇数位丢弃][求和][计算字符串的编辑距离]详细讲解

目录 1.奇数位丢弃1.题目链接2.算法原理详解 && 代码实现 2.求和1.题目链接2.算法原理详解 && 代码实现 3.计算字符串的编辑距离1.题目链接2.算法原理详解 && 代码实现 1.奇数位丢弃 1.题目链接 奇数位丢弃 2.算法原理详解 && 代码实现 解法…

丙类谐振功放的工作状态分析

前言&#xff1a;我们之前已经根据导通角θ&#xff0c;将工作状态分成了甲乙丙三类。我们发现丙类的效率最高&#xff0c;所以现在我们专门分析一下丙类工作状态。 1定量分析与定性分析 定量分析&#xff1a;是指分析以数量形式存在着的属性。 定性分析&#xff1a;是指分析…