【Python数据结构与算法】--- 递归算法应用-五行代码速解汉诺塔问题.

🌈个人主页: Aileen_0v0
🔥系列专栏:PYTHON数据结构与算法学习系列专栏
💫"没有罗马,那就自己创造罗马~" 


汉诺塔

两层汉诺塔的演示 

三层汉诺塔的走法演示

我不知道有没有朋友跟我一样有一个疑问,如果我们顶端的先放到中间柱子呢? 

但是实际上汉诺塔问题解决方案都是最优解,我们不走弯路,我们的目的性非常强,我们最终目的都是移动到c,所以我们可以先让顶端的木块直接到c 

解题思路:

不妨将这个问题拆解,n个汉诺塔,我们可以把最底下最大那个看成单独的一个,上面的(n - 1)个,看成一个整体.这样子最底下那个可以直接从 A 移动到 C,剩下上面的 ( n - 1 ) 个汉诺塔我们可以先从A 通过 C 移动到 B . 再从B通过 A 移动到 C.  

这样子不断进行递归,问题规模就可以逐层减小.

代码:

def hanoi(n,a,b,c):#n为层数 a,b,c是杆子if n>0:#将中间 n - 1 个盘子当成一个整体,通过c盘从a移动到b盘hanoi(n-1,a,c,b) # 中间柱子变目标print("Moving  from %s to %s" %(a,c)) # 对应一个柱子的时候hanoi(n-1,b,a,c) # 最后一个柱子变成目标hanoi(1,"A","B","C")

 运行结果:


青蛙跳台阶 

 

总结一下规律:

我们可以发现

跳  n 个台阶的台阶数对应的跳法 = 跳 (n - 1)个台阶时候的跳法 + 跳 (n - 2)个台阶时候的跳法. 

这有点像我们的斐波那契数列.

青蛙跳台阶的问题相当于动态规划的问题 .

动态规划:用上一步的结果,来快速计算得到下一步的结果.

递归的思路:

当只有1个台阶时,只有一种跳法;当有2个台阶时,有两种跳法;当台阶数大于2时,青蛙可以选择跳一步到第n-1个台阶,也可以选择跳两步到第n-2个台阶,所以总的跳法数是跳到第n-1个台阶的跳法数加上跳到第n-2个台阶的跳法数。

这里是青蛙跳台阶的Python递归实现

def frog_jump(n):if n == 1:return 1elif n == 2:return 2else:return frog_jump(n-1) + frog_jump(n-2)

其中,n表示台阶数,函数返回青蛙跳到第n个台阶的跳法数。

需要注意的是,这种递归实现虽然简单易懂,但是时间复杂度为指数级别的,所以不能用于大规模的数据处理。

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

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

相关文章

交替最小二乘法

前置概念导入 协同过滤(Collaborative Filtering):这是一种推荐系统的方法,依据用户之间或物品之间的相似性来进行推荐。协同过滤通常分为两种主要类型:用户基于(user-based)和物品基于&#xf…

享元模式 rust和java的实现

文章目录 享元模式介绍实现javarust实现代码 rust仓库rust仓库 享元模式 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应…

Tensorrt 实现 yolov5-cls 遇到的问题

yolov5-6.2增加了分类训练、验证、预测和导出(所有 11 种格式),还提供了 ImageNet 预训练的 YOLOv5m-cls、ResNet(18、34、50、101) 和 EfficientNet (b0-b3) 模型. 官方Git : https://github.com/ultralytics/yolov5 分类模型与…

安装gitlab

安装gitlab 环境 关闭防火墙以及selinux,起码4核8G 内存至少 3G 不然启动不了 下载环境 gitlab官网:GitLab下载安装_GitLab最新中文基础版下载安装-极狐GitLab rpm包下载地址: [Yum - Nexus Repository Manager (gitlab.cn)](https://pack…

C语言回文数(1106:回文数(函数专题))

题目描述 一个正整数&#xff0c;如果从左向 右读&#xff08;称之为正序数&#xff09;和从右向左读&#xff08;称之为倒序数&#xff09;是一样的&#xff0c;这样的数就叫回文数。输入两个整数m和n&#xff08;m<n)&#xff0c;输出区间[m&#xff0c;n]之间的回文数。 …

「C++」AVL树的实现(动图)

&#x1f4bb;文章目录 AVL树概念AVL的查找AVL树的插入 代码部分AVL树的定义查找插入旋转 &#x1f4d3;总结 AVL树 概念 AVL树又名高度平衡的二叉搜索树&#xff0c;由G. M. Adelson-Velsky和E. M. Landis发明&#xff0c;顾名思义&#xff0c;其任意节点的左右子树最大高度…

第十一章 目标检测中的NMS(工具)

精度提升 众所周知&#xff0c;非极大值抑制NMS是目标检测常用的后处理算法&#xff0c;用于剔除冗余检测框&#xff0c;本文将对可以提升精度的各种NMS方法及其变体进行阶段性总结。 总体概要&#xff1a; 对NMS进行分类&#xff0c;大致可分为以下六种&#xff0c;这里是依…

Android File Transfer(安卓文件传输工具)

Android File Transfer 是一款安卓文件传输工&#xff0c;它允许在Mac操作系统和Android设备之间进行文件传输。 该软件通过USB连接将文件从Mac电脑传输到连接的Android设备&#xff0c;或者反过来从Android设备传输文件到Mac电脑。这包括照片、视频、音乐、文档和其他文件类型…

基于SDN技术构建多平面业务承载网络

随着企业数字化的浪潮席卷各个行业&#xff0c;传统网络架构面临着更为复杂和多样化的挑战。企业正在寻找一种全面适应数字化需求的网络解决方案。随着软件定义网络&#xff08;SDN&#xff09;的发展&#xff0c;“多业务SDN一张网”解决方案为企业提供了一种全新的网络架构&a…

2023年中职“网络安全“—Linux系统渗透提权②

2023年中职"网络安全"—Linux系统渗透提权② Linux操作系统渗透测试任务环境说明&#xff1a;1. 使用渗透机对服务器信息收集&#xff0c;并将服务器中SSH服务端口号作为flag提交&#xff1b;2. 使用渗透机对服务器信息收集&#xff0c;并将服务器中主机名称作为flag…

【Linux学习笔记】基础IO

这里写目录标题 1. 系统文件I/O1.1. 接口介绍1.2. 库函数接口与系统接口的关系 2. 文件描述符fd2.1. 0&1&2文件描述符2.2. 文件描述符的分配规则2.3. 重定向2.4. 重定向系统调用2.5. 进程独立性 3. Linux下一切皆文件4. 缓冲区4.1. 缓冲区的理解4.2. 缓冲区的位置 5. 理…

1.2汉诺塔问题

汉诺塔问题&#xff1a; ​ 给定三根柱子&#xff0c;记为 &#xff0c;其中A,B,C 柱子上有 n个盘子&#xff0c;从上到下编号为 0到n-1, &#xff0c;且上面的盘子一定比下面的盘子小。问&#xff1a;将A柱上的盘子经由B柱移动到C柱最少需要多少次&#xff1f; 思路分析&…

学习Rust适合写什么练手项目?【云驻共创】

Rust是一门备受关注的系统级编程语言&#xff0c;因其出色的内存安全性、高性能和并发性能而备受赞誉。对于那些希望学习和掌握Rust编程语言的人来说&#xff0c;练手项目是一个不可或缺的环节。通过实际动手完成项目&#xff0c;你可以加深对Rust语言特性和最佳实践的理解&…

DAY59 503.下一个更大元素II + 42. 接雨水

503.下一个更大元素II 题目要求&#xff1a; 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数&am…

【运维】永久关闭selinux不当,导致无法启动

现象: 卡centos loading进度条 按esc键发现,启动报错: Failed to load SElinux policy ,freezing 可能的原因: selinuxdisabled 写错成disable 或者 错误的把selinuxtype改了&#xff0c;要改文中红框的部分。 解决方案: 1. 重启 2. 出现选择画面的时候 按e 3. 方向下键…

5-4计算一串字符的空格数字字符其他

#include<stdio.h> int main(){char c;int space0;//空格int letters0;//英文字母int numbers0;//数字int others0;//其他字符printf("请输入一行字符&#xff1a;");while((cgetchar())!\n)//获取字符的内容&#xff0c;到\n停止{if(c>a&&c<z|…

树与二叉树堆:二叉树

二叉树的概念&#xff1a; 二叉树是树的一种&#xff0c;二叉树是一个节点&#xff0c;最多只有两个子节点&#xff0c;二叉树是一个特殊的树二叉树的度最大为2 从上图可得一棵二叉树是结点的一个有限集合&#xff0c;该集合: 或者为空由一个根结点加上两棵别称为左子树和右子…

P2 C++变量

前言 一 C变量的作用 本期我们来讨论一下c 中的变量。 在一个 C 程序中&#xff0c;大部分内容实际上都是在使用数据。我们操作任何类型的数据&#xff0c;如包括我们想要改变、想要修改&#xff0c; 想要读和写数据。我们都需要把数据存储进叫做变量的东西里面。变量允许我们…

电子科技大学 分布式系统 期末复习笔记

第一章 为什么需要分布式系统&#xff1a;功能分离&#xff0c;固有的分布性&#xff0c;负载均衡&#xff0c;可靠性&#xff0c;经济性。 定义&#xff1a;分布式系统是这样一种系统&#xff0c;其中位于联网计算机上的组件仅通过传递消息来通信和协调它们的操作。 特点&am…

【ctfshow】web入门-信息搜集-web11~20

【ctfshow】web入门-信息搜集-web11~17 web11_域名其实也可以隐藏信息&#xff0c;比如flag.ctfshow.com 就隐藏了一条信息web12_有时候网站上的公开信息&#xff0c;就是管理员常用密码web13_技术文档里面不要出现敏感信息&#xff0c;部署到生产环境后及时修改默认密码web14_…