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

使用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秒。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 三种springboot启动时加载方式
  • 蓝桥杯【物联网】零基础到国奖之路:十. OLED
  • 花朵识别系统Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
  • 基于无人机影像的可见光单木分割数据集-json格式
  • [Python]二、Python基础数据科学库(1)
  • 2024最新!!!iOS高级面试题,全!(二)
  • Golang | Leetcode Golang题解之第416题分割等和子集
  • Linux系统(Ubuntu)(下载篇)
  • C++11标准模板(STL)- 常用数学函数 - 计算e的给定幂 (ex)(std::exp, std::expf, std::expl)
  • 【Oracle】ORA-02292: integrity constraint
  • Qt clicked()、clicked(bool)、toggled(bool)信号的区别和联系
  • 基于C语言的基数排序算法
  • 如何安装1Panel面板并架设一个静态网站
  • 【ChatGPT】提示词助力高效文献处理、公文撰写、会议纪要与视频总结
  • 深度学习——基础知识
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Angular 响应式表单之下拉框
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES6语法详解(一)
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • MYSQL 的 IF 函数
  • PHP 7 修改了什么呢 -- 2
  • Protobuf3语言指南
  • ReactNative开发常用的三方模块
  • SpriteKit 技巧之添加背景图片
  • zookeeper系列(七)实战分布式命名服务
  • 基于组件的设计工作流与界面抽象
  • 聚簇索引和非聚簇索引
  • 前端相关框架总和
  • 数据仓库的几种建模方法
  • 白色的风信子
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Java性能优化之JVM GC(垃圾回收机制)
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 数据库巡检项
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​第20课 在Android Native开发中加入新的C++类
  • (06)金属布线——为半导体注入生命的连接
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (强烈推荐)移动端音视频从零到上手(上)
  • (算法)大数的进制转换
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一) springboot详细介绍
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .htaccess 强制https 单独排除某个目录
  • .libPaths()设置包加载目录
  • .net CHARTING图表控件下载地址
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 命令行参数包含应用程序路径吗?
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)