使用python用递归实现汉诺塔算法

递归是一种非常好的解决难题的方法,有些问题用常规方法解会非常复杂,用递归解则非常简单方便。

汉诺塔是非常好的例子,用递归来实现调理清晰,算法非常简单,只需要几行代码即可。

在编程实践中,我们要思考一个实现功能,需要完成两大部分:

1 问题的算术描述,或者说是用编程语言来描述问题

2 问题的算术解决,用编程语言来解决问题。

算术描述

针对汉诺塔问题,算数描述为:

汉诺塔问题为函数hannuota

汉诺塔的三个位置,为函数的三个字符变量a b c,a为源,c为目标,b为中间临时放置用

汉诺塔的圆环数,为函数的第四个变量数字变量n

即函数hannuota(a, b, c, n)

挪动一块汉诺塔,如a挪到c,可以使用print语句来打印nuo a=>c

算术解决

对任何n,解决的方法都是把n-1个圆盘放到中间b,把最下面最大的圆盘放到c,然后再把中间的圆盘上所有的放到c即可

用函数来表示就是

hannuota(a, c, b, n-1)

hannuota(a, b, c, 1)

hannuota(b, a, c, n-1)

这样每一步都可以拆分成三步,n一直在减小,最终n会减小到1 

针对n=1的情况,我们知道直接把汉诺塔圆环从a挪到c即可,表现为使用print语句来打印nuo a=>c

这样整个汉诺塔的问题就解决了,是不是感觉很简单? 

汉诺塔python代码

这基本上是最简的代码了,当然挪动一步那里可以直接使用print(f"nuo {a}=>{c} "),但是我还是认为调用hannuota函数更加优美:

# 汉诺塔,a b c为位置,可以用字符串,比如“a” “ta”等,n为汉诺塔的圆环数,如3、4等
def hannuota(a, b, c, n):if n == 1 :print(f"nuo {a}=>{c} ")# passelse:hannuota(a, c, b, n-1)hannuota(a, b, c, 1)hannuota(b, a, c, n-1)

看这个代码多么的简洁漂亮!

可以试试n=3 或4的输出,n再大看起来就太费眼睛了。

# 展示三个圆环的汉诺塔实现过程
hannuota("a", "b", "c", 3)
nuo a=>c 
nuo a=>b 
nuo c=>b 
nuo a=>c 
nuo b=>a 
nuo b=>c 
nuo a=>c 

加速

既然我们已经有了这个代码,就想试试圆盘数多一点的情况。为了避免print语句耗费运算时间,我们把它去掉,用一句pass代替。整个函数没有输出,但是我们知道它是跑了一遍的

# 汉诺塔实现加速版,a b c为位置,可以用字符串,比如“a” “ta”等,n为汉诺塔的圆环数,如3、4等
def hannuotafast(a, b, c, n):if n == 1 :# print(f"nuo {a}=>{c} ")passelse:hannuotafast(a, c, b, n-1)hannuotafast(a, b, c, 1)hannuotafast(b, a, c, n-1)

对24层的汉诺塔,在星河社区AIStudio 2核环境下,耗时2.4秒

hannuotafast("a", "b", "c", 24)
运行时长:2.446秒结束时间:2024-09-21 18:33:40

对26层的汉诺塔,在星河社区AIStudio 2核环境下,耗时10.2秒。

大家也可以来试试自己的机器有多快,欢迎在评论区回复!

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

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

相关文章

缓存数据和数据库数据一致性问题

根据以上的流程没有问题,但是当数据变更的时候,如何把缓存变到最新,使我们下面要讨论的问题 1. 更新数据库再更新缓存 场景:数据库更新成功,但缓存更新失败。 问题: 当缓存失效或过期时,读取…

【C++】C++库:如何链接外部库、静态链接和动态链接,以及如何自建库并使用

十三、C库:如何链接外部库、静态链接和动态链接,以及如何自建库并使用 本篇讲C库,先讲如何在项目中使用外部库,包括静态链接和动态链接的实现;再讲如何在VisualStudio中自建模块或库项目,让所有项目都能使…

Java-数据结构-排序-(一) (。・ω・。)

文本目录: ❄️一、排序的概念及引用: ➷ 排序的概念: ➷ 常见的排序算法: ❄️二、插入排序的实现: ➷ 1、直接插入排序: ☞ 直接插入排序的基本思想: ☞ 直接插入排序的实现: ▶…

OBB-最小外接矩形包围框-原理-代码实现

前言 定义:OBB是相对于物体方向对齐的包围盒,不再局限于坐标轴对齐,因此包围点云时更加紧密。优点:能够更好地贴合物体形状,减少空白区域。缺点:计算较为复杂,需要计算物体的主方向&#xff0c…

linux 操作系统下dhcpd命令介绍和案例应用

linux 操作系统下dhcpd命令介绍和案例应用 DHCP(动态主机配置协议)在Linux操作系统中用于自动为网络中的设备分配IP地址和其他网络配置 DHCP的基本概念 DHCP协议通过UDP工作,主要有两个用途: 自动分配IP地址给网络中的设备。提…

Sn=a+aa+aaa+aaaa+aaaaa的前五项之和,其中a是一个数字

//计算求和 //Snaaaaaaaaaaaaaaa的前五项之和&#xff0c;其中a是一个数字 //如&#xff1a;222222222222222 #include<stdio.h> #include<math.h> #define A 2 //数字a #define B 5 //前几项的和 int main() {int n 0;int sum 0;int i 0;for (i 0; i <B;…

STM32F407单片机编程入门(十一) ESP8266 WIFI模块实战含源码

文章目录 一.概要二.ESP8266 WIFI模块主要性能参数三.ESP8266 WIFI模块芯片内部框图四.ESP8266 WIFI模块原理图五.ESP8266 WIFI模块与单片机通讯方法1.硬件连接2.ESP8266模块AT指令介绍 六.STM32单片机与ESP8266WIFI模块通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 …

变电站绝缘套管红外检测数据集

包含以下4个数据文件&#xff1a; /train&#xff1a;训练集 /valid&#xff1a;验证集 /test&#xff1a;测试集 README.txt&#xff1a;数据说明 【数据说明】检测目标以Pascal VOC格式进行标注&#xff0c;对每个图像进行以下预处理&#xff0c;统一调整大小为640x640。数据…

死机检测电路

目录&#xff1a; 1、死机检测概述 2、活机状态 3、死机状态 1、死机检测概述 本内容分享一个“死机检测电路”&#xff0c;用作单片机&#xff08;MCU&#xff09;死机时&#xff0c;不至于持续给负载供电。‌持续负载供电&#xff0c;比如加热丝&#xff0c;可能会引发严…

在腾讯云申请https(我得是腾讯云服务器),通过宝塔设置https

参考 一键 HTTPS&#xff1a;https://cloud.tencent.com/document/product/400/58062 DNS 验证&#xff1a;https://cloud.tencent.com/document/product/400/54500?from_cn_redirect1 申请免费的证书 访问连接&#xff1a;https://console.cloud.tencent.com/ssl 点击页…

hive分区详细教程

为什么要分区&#xff1f; 为了提高sql的查询效率 比如&#xff1a; select * from orders where create_date20230826; 假如数据量比较大&#xff0c;这个sql就是全表扫描&#xff0c;速度肯定慢。 可以将数据按照天进行分区&#xff0c;一个分区就是一个文件夹&#xff0c;当…

软件设计师——操作系统

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;软考——软件设计师&#x1f3c5;往期回顾&#x1f3c6;&#xff1a;C: 类和对象&#xff08;上&#xff09;&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱 一、操作系统…

伊犁云计算22-1 linux 逻辑卷管理

&#xff11;  三块硬盘  &#xff53;&#xff41;&#xff54;&#xff41;  先做组&#xff0c;再做逻辑 第一步添加三块硬盘&#xff0c;然后分区&#xff0c;装文件系统 这个过程参考之前的文章不说 新增了三块 &#xff53;&#xff44;&#xff42; &#xff…

vue3 快速入门系列 —— 基础

基础 前面我们已经用 vue2 和 react 做过开发了。 AIAutoPrediction 从 vue2 升级到 vue3 成本较大&#xff0c;特别是较大的项目。所以许多公司对旧项目继续使用vue2&#xff0c;新项目则使用 vue3。 有些UI框架&#xff0c;比如ant design vue1.x 使用的 vue2。但现在 an…

老年人养生之道:岁月静好,健康常伴

老年人养生之道&#xff1a;岁月静好&#xff0c;健康常伴 随着年岁的增长&#xff0c;老年人更需注重养生&#xff0c;以维持身心的和谐与健康&#xff0c;享受幸福晚年。养生不仅是一种生活态度&#xff0c;更是一种智慧的选择&#xff0c;它涵盖了饮食、运动、心理、社交等…

基于MPA-BP-Adaboost的多输入回归预测|海洋捕食者优化-BP神经网络

目录 一、主要内容&#xff1a; 二、运行效果&#xff1a; 三、Adaboost步骤&#xff1a; 四、MPA-BP的优化步骤&#xff1a; 五、本文完整代码数据下载&#xff1a; 一、主要内容&#xff1a; 本代码结合了海洋捕食者优化&#xff08;MPA&#xff09;算法与BP神经网络和A…

【医疗大数据】基于 B2B 的医疗保健系统中大数据信息管理的安全和隐私问题分析

基于 B2B 的医疗保健系统中大数据信息管理的安全和隐私问题分析 1、引言 1-1 医疗大数据的特点 10 V模型&#xff1a;在医疗领域&#xff0c;大数据的特点被描述为10 V&#xff0c;包括价值&#xff08;Value&#xff09;、体量&#xff08;Volume&#xff09;、速度&#xf…

抖音矩阵系统源码搭建,矩阵系统贴牌,矩阵工具开源

1. 抖音短视频矩阵系统 抖音短视频矩阵系统&#xff0c;是指通过抖音平台&#xff0c;以矩阵的形式进行短视频创作、发布和传播的一种模式。它以多样化的内容、丰富的表现形式、高度的专业化和协同性&#xff0c;吸引了大量用户和创作者的关注。 2. 短视频矩阵系统的优势 2.1 …

BLE 设备丢包理解

前言 个人邮箱&#xff1a;zhangyixu02gmail.com在学习 BLE 过程中&#xff0c;总能听到 “丢包” 一词&#xff0c;但是我查阅资料又发现&#xff0c;有大佬说&#xff0c;ATT所有命令都是“必达”的&#xff0c;不存在所谓的“丢包”。而且我发现&#xff0c;在宣传 BLE 产品…

力扣中等 153.寻找旋转排序数组中的最小值

文章目录 题目介绍题解 题目介绍 题解 正解&#xff1a;可以和数组最后一个数比较&#xff0c;来判定二分的位置是在最小值的左侧还是在最小值的右侧。 在0到n-2二分&#xff0c;如果nums[mid] > nums[n - 1]&#xff0c;则mid在最小值的左侧&#xff0c;mid和其左侧染成红…