多柱汉罗塔(python解法,带注释,注释为个人理解)

article/2025/6/16 8:17:09

一、参考链接:

1、普通汉罗塔链接(这边也是我的博文):

(166条消息) 递归经典算法案例题(汉罗塔、阶乘、斐波那契代码)_南风~古草的博客-CSDN博客_汉罗塔


 

2、大佬的多柱汉罗塔博文(有数学推导,该代码为C++,我这篇python多柱是根据其C++该写过来,思想纯借鉴,plus的地方为个人理解的注释

(166条消息) 多柱汉诺塔问题浅析——算法及公式推导_li-ucas的博客-CSDN博客_多柱汉诺塔

二、具体题目: 

经典的汉诺塔问题。汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘。有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。恩,当然这个传说并不可信,如今汉诺塔更多的是作为一个玩具存在。有一天你就收到了一个汉诺塔玩具作为生日礼物。 你是个怕麻烦的人,显然将64个圆盘逐一搬动直到所有的盘子都到达第三个柱子上很困难,所以你决定作个小弊,找来了m根一模一样的柱子,通过这m个柱子来更快的把所有的盘子移到第三个柱子上,移动规则一样。 问题:在一次游戏中,使用了n个圆盘时,三根柱子,至少需要多少次移动才能把他们都移到第三个柱子上?很显然,在没有其他柱子时,问题的解是2^(n-1),但现在有了这m个柱子的帮助(m<n),又该最少移动多少次呢? ①要求输入任意的m, n都能给出正确结果。 ②要考虑任意的输入

 三、代码和注释:


# 动态规划思想,算过一次的结果存在,后面直接用
dicts = {}# 分治,穷举(优点在于有限界约束条件,多余的步骤提前结束)
def help(n,m):# 盘子数小于零没意义,柱子数小于3时已经不是汉罗塔问题,1或者2根柱子根本移不了if(n<0 or m < 3):return -1# 柱子数合理的前提下,1个盘移动一次即可if(n==1):return 1# 用元组记录当前求的是几个盘几根柱子的问题nowNM = (n,m)# 返回值为True,说明字典中保存得有当前要计算的结果if(judgeDicts(nowNM)):# 根据键取出值,即得当前要计算的结果return dicts[nowNM]# 三根柱子,可直接简化运算,返回2的盘子数次方-1(普通汉罗塔中的结论)if(m == 3):nowValue = pow(2,n)-1else:# 从起始柱子到目标柱子,柱子的排列顺序可以打乱#n-1个盘可移往m根柱子中的任意一根(顺序随意,此处为过度柱),剩下的一个盘可移往除前面那根过度柱子外的m-1根柱子中任意一根(目的柱)#n-1个盘再从过度柱移往目标柱nowValue = 2 * help(n-1,m)+help(1,m-1)# 穷举,然有限界约束条件# 过度桩盘子每递减1,目标桩盘子递增1。之前过度桩算了n-1,所以从n-2开始# 举例:4盘4柱,分为(3,4)(1,3)注意这一项在前面算过,遍历只需后两项(当然后两项也有可能被限制条件打断);# (2,4)(2,3);(1,4)(3,3)for i in range(n-2,0,-1):temp = 2*help(i,m)+help(n-i,m-1)# 通多数学推算,到后面的各项结果会相等,即temp=nowValue,走else分支提前跳出循环,省去多余的步骤# 原理2*前者+后者,前者权重大而后者权重小,理论上前者越小,终值越小# 但是到一定程度,前者减小的同时,后者增加的跨度极具变更大,我们要求移动次数尽量少,就不用管后面的了(数学案例总结)if(temp<nowValue):nowValue = tempelse:break# 在字典中记录当前几盘几柱的解,以便后面复用dicts[nowNM] = nowValue# print(dicts)return nowValuedef judgeDicts(nowNM):# 默认字典中没有保存当前n盘m柱的结果flag = False;# 遍历字典,如果字典的键相同,说明字典集合中,以前保存得有该结果for i in dicts:if(i==nowNM):return Truereturn flagif __name__ == '__main__':print("盘子数为:",end=" ")n = int(input())print("柱子数为:",end=" ")m = int(input())print("最少需要移动的次数为:",end=" ")print(help(n,m))

四、运行结果测试:


http://chatgpt.dhexx.cn/article/Jp0l0dbu.shtml

相关文章

累加—递归汉罗塔问题 (C语言)

一、累加—递归 一、代码 二、测试结果 二、汉罗塔问题 一、分析 二、代码 三、测试结果 三、总结 一、累加—递归 一、代码 //累加的递归实现 #include <stdio.h>int addTo(int n) {if(n < 0)return 0;else{return addTo(n-1)n;} } void addToTest() {int n…

【C语言】汉罗塔

前言 &#x1f388;大家好&#xff0c;我是何小侠&#x1f388; &#x1f300;大家可以叫我**小何或者小侠&#x1f300;** &#x1f534;我是一名普通的博客写作者&#x1f534; &#x1f490;希望能通过写博客加深自己对于学习内容的理解&#x1f490; &#x1f338;也能帮助…

[C语言]C语言解决汉罗塔问题(初学者版)

目录 1、汉罗塔问题解决思路&#xff1a; 2、代码实现&#xff1a; 函数部分&#xff1a; 全部代码&#xff1a; 运行结果&#xff1a; 3、结语&#xff1a; 1、汉罗塔问题解决思路&#xff1a; 以三个为例&#xff0c;步骤为&#xff1a; 1.首先我们需要将其分成两个整体…

汉诺塔问题的详细讲解(python版)

2022.3.17 2022.11.15 增加次数计算一&#xff0e;抽象为数学问题&#xff1a; 从左到右有A、B、C三根柱子&#xff0c;其中A柱子上面有从小叠到大的n个圆盘&#xff0c;现要求将A柱子上的圆盘移到C柱子上去&#xff0c;期间只有一个原则&#xff1a;一次只能移到一个盘子且大…

Golang 汉罗塔问题

先用一般方法实现汉罗塔方法: 先确定三个"石柱" A B C 。n代表A柱起始圆盘数量 主函数: 结合栈来实现汉罗塔。 因为栈先进后出的特点 很适合汉罗塔。其实和上述方法本质一样,只不过添加了 栈的特性 这里定的栈最大容量为7,可以根据实际情况更改 栈的构造&#xff…

汉罗塔(递归分治)

Java代码如下 public class Hanoi {//操作步骤数private static int steps 1;public static void main(String[] args) {//盘子数目int diskNumber 4;doTowers(diskNumber, A, B, C);}private static void doTowers(int diskNum, char from , char via, char to){if (diskNum…

汉诺塔(Hanoi)问题,Java实现,C语言实现,Python实现!!!

目录 一、汉诺塔的玩法 二、汉诺塔的逻辑 三、代码实现 四、运行结果 五、总结 一、汉诺塔的玩法 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#x…

Java基础语法(汉罗塔)

Java基础语法&#xff08;汉罗塔&#xff09; 1 起源2 需求3 分析3.1 1个碟子3.2 2个碟子3.3 3个碟子3.4 4个碟子3.5 规律 4 代码实现&#xff1a;直接算法5 代码实现封装&#xff1a;栈的思想 1 起源 汉罗塔&#xff08;又称河内塔&#xff09;问题是源于印度一个古老传说的益…

《经典递归问题:汉罗塔》

&#x1f320;作者&#xff1a;TheMythWS. &#x1f386;专栏&#xff1a;《JavaSE》 &#x1f387;座右铭&#xff1a;不走心的努力都是在敷衍自己&#xff0c;让自己所做的选择&#xff0c;熠熠发光。 目录 ✨汉罗塔的介绍 图解游戏​ ✨N层汉罗塔需移动的次数 ✨汉罗塔的…

数据链路层 功能概述

数据链路层的研究思想 数据链路层基本概念 数据链路层功能概述 数据链路层功能概述

数据链路层功能概述、封装成帧与透明传输

你一定要做自己&#xff0c;做自己喜欢的事&#xff0c;然后把自己交给命运 文章目录 本章启航思维导图数据链路层数据链路层基本概念数据链路层功能概述封装成帧透明传输组帧的四种方法字符计数法字符填充法零比特填充法违规编码法 本章启航思维导图 数据链路层 数据链路层基…

【计算机网络】数据链路层——数据链路层功能/组帧/差错控制

文章目录 数据链路层数据链路层的功能为网络层提供服务链路管理帧定界、帧同步与透明传输流量控制 组帧字符计数法字符填充的首尾定界符法零比特填充的首尾标志法违规编码法 差错控制检错编码奇偶校验码循环冗余码 纠错编码 数据链路层 数据链路层的功能 数据链路层在物理层提…

19数据链路层的功能

1、数据链路层的功能 数据链路层在物理层提供服务的基础上向网络层提供服务&#xff0c;其主要作用是加强物理层传输原始比特流的功能&#xff0c;将物理层提供的可能出错的物理连接改造成逻辑上无差错的数据链路&#xff0c;使之对网络层表现为一条无差错的链路。 2、为网络层…

计算机网络——数据链路层功能概述、封装成帧、差错控制、流量控制与可靠传输机制

文章目录 前言一、数据链路层功能概述二、封装成帧1、透明传输2、封装成帧3、组帧的方法⑴字符计数法⑵字符/节填充法⑶零比特填充法⑷违规编码法 三、差错控制1、差错由来2、检错编码⑴奇偶校验码⑵循环冗余码 3、纠错编码——海明码 四、流量控制与可靠传输机制1、停止等待协…

计算机网络【数据链路层的功能】

计算机网络【数据链路层的功能】 数据链路层基本概念数据链路层功能概述封装成帧透明传输字符计数法字符填充法零比特填充法 差错控制差错从何而来&#xff1f;CRC 循环冗余码 数据链路层基本概念 数据链路层使用的信道主要有一下两种类型&#xff1a; 点对点信道&#xff1a…

数据链路层主要功能

透明传输 个人理解&#xff0c;透明传输其实就是指无论是什么报文都可以传输&#xff0c;非透明传输就是指某些特殊字符不能传输&#xff0c;在计算机网络中&#xff0c;透明传输在数据链路层提到过&#xff0c;在数据链路层将网络层协议封装成帧时&#xff0c;会在首部和尾部分…

数据链路层(内容超多哦)

数据链路层——交换机 1. 数据链路概述2. 以太网2.1 以太网帧格式2.2 交换机设备简介2.3 交换机的工作原理2.4 交换机以太网的工作模式2.5 配置前的准备 3. 命令行的使用 1. 数据链路概述 数据链路层的功能&#xff1a;1.数据链路的建立、维护与拆除 2.帧包装、帧传输、帧同步…

计算机网络:数据链路层功能

文章目录 1.为网络层提供服务2.链路管理3.帧定界、帧同步与透明传输4.流量控制5.差错控制 数据链路层在物理层提供服务的基础上向网络层提供服务&#xff0c;其主要作用是加强物理层传输原始比特流的功能&#xff0c;将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据…

计算机网络-数据链路层功能概述

数据链路层的研究思想 基本概念 结点: 主机, 路由器 链路: 网络中两个结点之间的物理通道, 链路的传输介质主要有双绞线, 光纤 和微波, 分为有线链路和无线链路 数据链路: 网络中两个结点的逻辑通道, 把现实控制数据传输协议的硬件和软件加到链路上就构成了数据链路 帧: 链…

第三章:数据链路层(一)

数据链路层基本概念 结点:主机、路由器 链路:网络中两个结点之间的物理通道&#xff0c;链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。 数据链路&#xff1a;网络中两个结点之间的逻辑通道&#xff0c;把实现控制数据传输协议的硬件和软件加到链路上就构…