递归详解之青蛙跳台阶和汉诺塔问题

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑 
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑    希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑   此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回
👑👑👑💎👑👑👑     
————————————————
版权声明:本文为CSDN博主「Solitary-walk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/X_do_myself/article/details/134220644

一:递归的简单了解

1.递归定义:

     递归的思想是把一个大型复杂问题层层转化为一个与原问题规模更小的问题,问题被拆解成子问题后,递归调用继续进行,直到子问题无需进一步递归就可以解决的地步为止。

换言之就是大事化小,小事化了的一个过程

2.递归的必要条件:

  1)必须有递归结束的条件

   2)在递归的过程中不断接近递归结束的条件

二:青蛙跳台阶

1.问题:从前有一只小青蛙,他想通过自己的实力来到台阶的最顶端,看看高处的放进如何,但是他遇到一个问题,不知道自己要如何走到顶峰,那么聪明的你,没错,就是此时正在玩博客的你,是否可以设计出青蛙跳台阶的这个过程?

接下来我们一起分析:

首先以3个台阶为例,进行分析:

 其实大的角度无非就两个问题: 一次跳两个  ? 一次跳一个  进行组合  

  1) 一次跳一个 

2) 先跳一个台阶 -> 再跳2个台阶

3) 先跳2个台阶  -> 再跳1给台阶

    其实回归问题本质就是:

对于  n 个台阶,当第一次选择跳一个台阶的时候,剩余n-1 台阶要如何走

当第一次选择跳2个台阶的时候,剩余 n-2台阶如何走

ok ,想必有了以上的开胃小菜,接下来的代码实现就会很好理解

 首先我们建立一个函数Jump(int n)     : 表示跳n 个台阶有多少种方法

Jump(n) = Jump(n-1) + Jump(n-2)  借助递归算法很简便

int  Jump(int n)
{//n = 1,只有一种跳法
// n = 2 ,2种跳法if (n == 1){return 1;}if (n == 2){return 2;}if (n > 2){return Jump(n - 1) + Jump(n - 2);}}

 优化之后的代码


int  Jump(int n)
{/*if (n == 1){return 1;}if (n == 2){return 2;}*/if (n <= 2){return n;}if (n > 2){return Jump(n - 1) + Jump(n - 2);}}

三:汉诺塔问题

 问题的描述是:有三根柱子,A、B、C,A柱上放有n个大小不等的圆盘,大的在下,小的在上。要求把A柱上的圆盘全部移到C柱上,并且在移动过程中要遵守以下规则:一次只能移动一个圆盘;大的圆盘不能放在小的圆盘上面。

     接下来咱话不多,直接进行分析就行:

初状态的草图:

 这里我们需要借助C柱子,把1,2号盘子移动到我的B柱子上

草图如下:

1)盘子1的移动:

2)盘子2:

3)盘子3:

4)

1)盘子1的移动: A->C

2 ) 盘子2 :A->B

3) 盘子3 :需要先把盘子2移动到B上  C->B  接着是移动盘子3 A->C

4)1移动到A,B->A

5)2移动到C ,B->c

6) 1直接移动到C ,A->C

 接下来回归问题本质:

对于n个盘子而言就是 前n-1个盘子的移动和第n个盘子的移动

在这里我设计2个函数

Hanoi(int n,char pos1,char poos2,char pos3)  用来递归实现移动

Move(char pos1,char pos2)  用来打印盘子的移动过程

void Hanoi(int n, char pos1, char pos2, char pos3)  //此函数用来递归实现盘子的移动,移动的本质就是:起始位置->中转位置->目标位置
{//注意: pos1;盘子的起始位置,A   pos2:中转位置,B   pos3:盘子最终的目标位置,C// n:盘子的个数//当是一个盘子的话,直接从我的起始位置移动到我的目标位置if (n == 1){Move(pos1, pos3);}else{//当n>1其实就是一个就是 n-1个盘子和一个盘子的移动问题Hanoi(n - 1, pos1, pos3, pos2);//注意这里的第二个参数表示盘子的中转位置,并不表示我的目标位置Move(pos1, pos3);//A柱子上的最后一个盘子直接移动到我的目标位置Hanoi(n - 1, pos2, pos1, pos3);}}}
int main()
{Hanoi(2, 'A', 'B', 'C');printf("\n");Hanoi(3, 'A', 'B', 'C');printf("\n");return  0;
}

 运行结果:

以上就是我今日的share,递归这个思想是很重要的在后期的学习中我也会不断更新,各位大佬们,觉得还不错的话,互关互赞一下吧,蟹蟹

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

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

相关文章

51单片机三种编译模式的相互关系

51单片机三种编译模式的相互关系 编译模式默认存储类型RAM使用规模变量使用特点SAMLLdata128B片内RAM使用规模CPU访问数据速度快&#xff0c;但存储容量较小COMPACTpdata258B片外分页RAM速度和容量介于上下两者之间LARGExdata64KB片外RAMCPU访问数据的速度较慢&#xff0c;但存…

idea利用JRebel插件,无需重启,实现Spring Boot项目热重载,节省开发时间和精力!

插件介绍 官方介绍 翻译过来的意思是&#xff1a; JRebel 是一款提高开发效率的工具&#xff0c;允许开发者立即重新加载代码更改。它跳过了在Java开发中常见的重新构建、重启和重新部署循环。JRebel 能够让开发者在相同的时间内完成更多工作&#xff0c;并且在编码时能够保持…

Linux Ubuntu 和 Mac ,Windows 部署离线通义千问1.8B参数 4-bit量化大模型详细教程 全网唯一

代码为我自己写的 python 程序,应该是全网最简单的大模型部署方案,一个模型文件1.3GB,一个python代码即可开始玩耍~ 首先说明,本文下面的内容需要一点点python基础,需要会安装 python和 pip 安装依赖库,如果你不会或者不想这么麻烦,只想要下载就能马上使用的大模型离线整…

【Unity3D】Unity3D技术栈

1 前言 本文梳理了笔者在学习 Unity3D 的过程中&#xff0c;对 Unity3D 的理解和学习路线&#xff0c;以帮助读者循序渐进地学习 Unity3D&#xff0c;后续笔者仍会持续更新 Unity3D 相关技术栈&#xff0c;并同步到本文中。 1.1 专栏文章特点 知识系统&#xff1a;专栏从资源…

python------Pymysql模块

查询 总结&#xff1a; fetchall(): 获取所有查询到的内容。返回结果是嵌套的元组 fetchone(): 获取一条数据。返回结果就是一个非嵌套的元组 fetchmany(num): 返回结果是元组嵌套&#xff0c;底层也是有游标的。如果不传递参数num&#xff0c;默认读取一条数据 注意: 与文件…

CSS与JavaScript的简单认识

CSS&#xff1a;是一门语言&#xff0c;用于控制网页表现&#xff0c;让页面更好看的。 CSS&#xff08;Cascading Style Sheet&#xff09;&#xff1a;层叠样式表 CSS与html结合的三种方式&#xff1a; 1、内部样式&#xff1a;用style标签&#xff0c;在标签内部定义CSS样式…

vim学习笔记

vim学习笔记 Linux Vim编辑器的基本使用 显示行号 set nu 自动补全 CTRL-N或CTRL-P $到当前行的末尾 u 撤销上一步的操作 Ctrlr 恢复上一步被撤销的操作 vim下配置tab缩进格数 原始文件&#xff1a; helloworld nice 普通缩进 shift > &#xff08;或者 Shift <…

springcloud微服务篇--6.网关Gateway

一、为什么需要网关&#xff1f; 网关功能&#xff1a; 身份认证和权限校验 服务路由、负载均衡 请求限流 在SpringCloud中网关的实现包括两种&#xff1a; gateway zuul Zuul是基于Servlet的实现&#xff0c;属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的Web…

【SpringCloud笔记】(12)分布式请求链路跟踪之Sleuth

Sleuth 背景 在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果&#xff0c;每一个前段请求都会形成一条复杂的分布式服务调用链路&#xff0c;链路中的任何一环出现高延时或错误都会引起整个请求最后的…

通信原理课设(gec6818) 006:网络编程

目录 1、概念 2、通信 3、通信基本流程 TCP: UDP: 4、函数 I 创建套接字 II 绑定地址 III 字节序转换 IV 地址转换 V 监听 VI accept VII connect VIII 从套接字接收信息 IX 从套接字发送消息 X 关闭套接字 5、网络配置 1、确保你的网卡里面有两个虚拟网卡&a…

WeNet语音识别分词制作词云图

在线体验 ,点击识别语音需要等待一会&#xff0c;文件太大缓存会报错 介绍 本篇博客将介绍如何使用 Streamlit、jieba、wenet 和其他 Python 库&#xff0c;结合语音识别&#xff08;WeNet&#xff09;和词云生成&#xff0c;构建一个功能丰富的应用程序。我们将深入了解代码…

JavaScript 中类和构造函数的区别

JavaScript 中的类和构造函数在实现上有一些区别&#xff0c;但它们的目的相同&#xff0c;都是用于创建对象。 构造函数是一种特殊的函数&#xff0c;它用于创建对象。构造函数使用 new 关键字来创建一个对象实例&#xff0c;并将属性和方法添加到该实例上。构造函数一般以大…

XXL-JOB学习笔记-基于注解实现自动注册新建任务

项目每次注册新建任务都需要手动操作配置xxl-job&#xff0c;不同的环境都需要手动操作配置一次&#xff0c;比较麻烦&#xff0c;为此想要简化相关的手动操作工作&#xff0c;基于注解的形式实现自动注册新建任务。 本篇是在之前一篇基于代码实现新建任务的基础上进一步实现。…

AUTOSAR从入门到精通- 虚拟功能总线(RTE)(三)

目录 前言 RTE的主要功能 几个高频面试题目 RTE基础面试题目 什么是数据转换?

第2课 使用FFmpeg读取rtmp流并用openCV显示视频

本课对应源文件下载链接&#xff1a; https://download.csdn.net/download/XiBuQiuChong/88680079 这节课我们开始利用ffmpeg和opencv来实现一个rtmp播放器。播放器的最基本功能其实就两个:显示画面和播放声音。在实现这两个功能前&#xff0c;我们需要先用ffmpeg连接到rtmp服…

LVS负载均衡配置虚拟引起微服务注册混乱

线上小程序突然报错&#xff0c;查看网关日志&#xff0c;访问下游微服务A时大量报错&#xff1a; 1&#xff09;检查微服务是否未注册。登录eureka页面&#xff0c;发现三个节点均正常注册 三个微服务节点地址分别为&#xff1a;13.9.1.91:8080&#xff0c;13.9.1.92:8080和1…

开源服务指南使用手册

开源服务指南是什么&#xff1f;从哪里来&#xff1f;往哪里去&#xff1f; 定位 用中文推荐优质开源项目&#xff0c;让开发者更容易找到趁手的开源工具。 Slogan 发现开源之美&#xff0c;碰撞无限可能。 我们想要让大家知道更多优秀的开源项目&#xff0c;发现开源的美…

ARM CCA机密计算软件架构之软件堆栈概述

Arm CCA平台通过硬件添加和固件组件的混合方式实现,例如在处理元素(PEs)中的RME以及特定的固件组件,特别是监视器和领域管理监视器。本节介绍Arm CCA平台的软件堆栈。 软件堆栈概述 领域VM的执行旨在与Normal world(正常世界)隔离,领域VM由Normal world Host(正常世界…

【软件工程】融通未来的工艺:深度解析统一过程在软件开发中的角色

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 统一过程&#xff08;Unified Process&#xff09; 介绍和解释&#xff1a; 应用&#xff1a; 优缺点&#xf…

C/C++ 函数的默认参数

下面介绍一项新内容 - 默认参数。 默认参数指的是当函数调用中省略了实参时自动使用的一个值。 例如&#xff0c;如果将 void wow (int n)设置成n 有默认值为1&#xff0c;则函数调用 wow()相当于 wow(1)这极大地提高了使用函数的灵活性。 假设有一个名为left()的函数&#xff…