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

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇: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.hqwc.cn/news/309881.html

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

相关文章

<PDF-Pics> support

If get any questions,email me caohechunhotmail.com

SpringBoot 日志打印

一. 自定义打印日志 开发者自定义打印日志实现步骤: • 在程序中得到日志对象 • 使用日志对象的相关语法输出要打印的内容. 得到日志对象: //日志工厂需要将需要打印的类的类型传递进去,这样我们才知道日志的归属类,才能更方便的定位到文体类 private static Logger logger …

个人财务管理软件Money Pro mac功能特点

Money Pro mac是一款专为Mac用户设计的个人财务管理软件&#xff0c;具有全面的账户管理、智能的预算规划、强大的投资分析、丰富的报表和图表、安全的数据保护以及易于使用的界面设计等特点。 Money Pro mac功能和特点 全面的账户管理&#xff1a;支持多种账户类型&#xff0…

大数定律中心极限定理

1.切比雪夫不等式 切比雪夫不等式可以对随机变量偏离期望值的概率做出估计&#xff0c;这是大数定律的推理基础。以下介绍一个对切比雪夫不等式的直观证明。 1.1 示性函数 对于随机事件A&#xff0c;我们引入一个示性函数 I A { 1 , A发生 0 , A不发生 I_A\begin{cases} 1&…

FAST-LIO论文解析

题目&#xff1a;FAST-LIO&#xff1a;一种快速鲁棒的基于紧耦合迭代卡尔曼滤波的雷达-惯导里程计 摘要 本文提出了一种计算效率高、鲁棒性好的激光-惯性里程计框架。我们使用紧耦合的迭代扩展卡尔曼滤波器将LiDAR特征点与IMU数据融合在一起&#xff0c;从而在快速运动、嘈杂…

.NetCore NPOI 读取excel内容及单元格内图片

由于数据方提供的数据在excel文件中不止有文字内容还包含图片信息&#xff0c;于是编写相关测试代码&#xff0c;读取excel文件内容及图片信息. 本文使用的是 NPOI-2.6.2 版本&#xff0c;此版本持.Net4.7.2;.NetStandard2.0;.NetStandard2.1;.Net6.0。 测试文档内容&#xf…

IP地理位置定位技术基本原理

IP地理位置定位技术的基本原理是基于IP地址的特性。每个IP地址在网络中都有一个与之对应的地理位置信息&#xff0c;这是通过IP地址数据库来确定的。这个数据库由ISP&#xff08;Internet Service Provider&#xff09;或其它一些机构维护&#xff0c;其中包含了每个IP地址的地…

两向量叉乘值为对应平行四边形面积--公式推导

两向量叉乘值为对应平行四边形面积--公式推导 介绍 介绍

每日一题——LeetCode942

方法一 个人方法&#xff1a; 找规律&#xff0c;碰到I优先放最小的数&#xff0c;碰到D优先放最大的数&#xff0c;将0-n按照从小到大的顺序放入数组保存&#xff0c;碰到I就从数组前面取值&#xff0c;碰到D就从数组后面取值 var diStringMatch function(s) {var arr[],pe…

windows 安装multipass

安装说明 Multipass orchestrates virtual Ubuntu instances Launch an instance (by default you get the current Ubuntu LTS) multipass launch --name foo 下载 Multipass orchestrates virtual Ubuntu instances 安装 执行安装exe 前提 需要安装hyper-V 参考链接 …

【网络安全常用术语解读】SCAP详解

本文主要介绍什么是SCAP&#xff0c;SCAP的产生背景是怎样的&#xff0c;SCAP有什么用途&#xff0c;有哪些组件&#xff0c;各个组件的用途是什么&#xff1f; SCAP产生背景 由于计算机和网络技术的快速发展&#xff0c;越来越多的软件和系统被应用到企业和机构中&#xff0c…

slf4j+logback源码加载流程解析

Logger log LoggerFactory.getLogger(LogbackDemo.class);如上述代码所示&#xff0c;在项目中通常会这样创建一个Logger对象去打印日志。 然后点进去&#xff0c;会走到LoggerFactory的getILoggerFactory方法&#xff0c;如下代码所示。 public static ILoggerFactory getILo…