【C语言】青蛙跳台阶问题 - 递归算法(一种思路,针对三种不同的情况)

文章目录

  • 1. 前言
  • 2. 题目和分析
    • 2.1 代码实现
    • 2.2 反思 (重点)
  • 3.题目二(变式)
    • 3.1 分析
    • 3.2 代码实现
  • 4. 题目三(变式)
    • 4.1 分析
    • 4.2 代码实现

1. 前言

相信大家看到青蛙跳台阶问题时,第一时间就会想到递归。那你知道为什么会使用递归吗?如果你对此一知半解的话,那么请跟随我的脚步,一起探索递归解决问题背后的秘密。

可能也有的读者会问,我不是学C语言的,看这个会不会不合适。对此,我只想说:编程的尽头是天马行空的脑洞和转化问题的能力,编程语言只是我们解决问题的工具,只要问题被解决了,用什么语言效果都是大差不差的。

那么,话不多说,Let’s go!!!

2. 题目和分析

题目一:一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶,求该青蛙跳上一个n级的台阶总共需要多少种跳法。

问题的描述很简单,那我们的破题关键在哪里呢?

我们可以先罗列几种情况,看一下有什么规律。
罗列情况
从这里,你可以发现一个规律:

当只有一个台阶时,青蛙它别无选择,它只需要跳一步就可以了;

当存在两个台阶时,青蛙此时就会有两种方法。
第一种就是,当青蛙选择一开始先跳一步时,那么两个台阶就只剩下一个台阶要跳了,那还能怎么办,继续跳就完事了。
第二种就是,青蛙选择一次跳两步,两个台阶就被跳完了。

当存在三个台阶时,青蛙此时就会有三种方法。
第一种:一步一步地跳。
第二种:先选择跳一步之后 ,再一次跳两步。
第三种:先选择跳两步,最后再跳一步就行。

后面的列举是一样的思路,限于篇幅的原因,这里就不再过多列举了。

看到这里,我们不妨假设,变量n为青蛙要跳的台阶数,函数Fun为计算青蛙台阶的方法个数。

int Fun(int n)
{... //代填写的内容
}

那么根据题目的要求,我们可以知道一个点,就是:Fun(1) = 1,Fun(2) = 2

仔细观察,我们可以发现一个规律:
当台阶数n=3时,Fun(3) = Fun(2) + Fun(1)

为此,我们可以总结出一个递推公式,就是Fun(n) = Fun(n-1) + Fun(n-2) (n>2)。

为此,我们就可以开始写函数了。

2.1 代码实现

#include<stdio.h>
int Fun(int n)
{if (n<=2) //递归退出条件{return n;}else{return Fun(n - 1) + Fun(n - 2);}
}int main()
{int n = 0;scanf("%d", &n);int ret = Fun(n);printf("%d\n", ret);return 0;
}

2.2 反思 (重点)

可能有的读者对这个规律总结的出现,仍然感觉到很诧异。那么我现在就用语言来解释这个递推公式背后的秘密。

我们可以想象一下,当台阶数大于2时:

当台阶数n=3时,聪明的青蛙此时就会说:“那我先跳1个台阶试试看后面的情况。” 既然青蛙已经跳过了1个台阶,那么总的台阶数就还剩2个。而这个问题不就又转换为:跳两个台阶有多少种跳法。
那这里可能有的读者还会提一个问题,如果青蛙先跳2个台阶呢?还会上述的推理过程吗?
其实大致的方向是不变的,就改一下顺序就可以了。为此你就可以理解Fun(n) = Fun(n-1) + Fun(n-2)这个公式的强大之处,它无关你跳的前后顺序。

看到这里,你可能还是不理解上述的语言表述,我就在多举一个例子

那么,当台阶数n=4,又会发生什么情况呢?Fun(4)
一样的解题思路:
当青蛙选择跳1步时,那么台阶就还剩3个,问题不就又转化为:求3个台阶有多少种跳法。Fun(3)
可是这样还不够啊,青蛙也有可能一开始就跳两步,
当青蛙一开始就跳2步,那么台阶就还剩2个,问题不就又转化为:求2个台阶有多少种跳法。Fun(2)
所以,Fun(4) = Fun(3) + Fun(2)

看到这里,我想你已经彻底理解了这个递推公式的精髓所在了。

这里面也蕴含了一种思想:大事化小的思想,这个不正是我们使用递归的核心思想。通过青蛙的每一步选择都会出现看两种不同的结果,但是每种结果的尽头,台阶数最终不是剩下2个就是1个,都会回到递归的退出条件。

3.题目二(变式)

题目二:一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶…,还可以跳上n级台阶,求该青蛙跳上一个n级的台阶总共需要多少种跳法。

如果你理解上面青蛙跳台阶的思路,那么这道题就不难了。

3.1 分析

这里我就简单分析一下:
与第一道不同的是,青蛙可以这次可以选择跳<=n的步数了,但是,基本的思路是一样的。
图

假设有n个台阶,函数Fun用来计算n个台阶有多少种跳法。
那么,我们就可以得到一个递推公式:
Fun(n) = Fun(n-1) + Fun(n-2) + … + Fun(2) + Fun(1) + 1 ①
Fun(n-1) = Fun(n-2) + Fun(n-3) + … + Fun(2) + Fun(1) + 1 ②

将上述的①和②结合一下:
Fun(n) = Fun(n-1) + Fun(n-1) = 2*Fun(n-1)

3.2 代码实现

#include<stdio.h>int Fun(int n)
{if (n == 1){return 1;}else {return 2*Fun(n - 1);}
}int main()
{int n = 0;scanf("%d", &n);int ret = Fun(n);printf("%d\n", ret);return 0;
}

4. 题目三(变式)

问题三:一只青蛙一次可以跳上一级台阶,也可以跳上二级台阶…,还可以跳上m级台阶,求该青蛙跳上一个n级的台阶总共需要多少种跳法。

4.1 分析

这道题目又和上一道题目有所不同,这次青蛙最多跳<=m个台阶数。

由上两题总结出的思路,我们可以很快地写出此题的递推公式:
Fun(n) = Fun(n-1) + Fun(n-2) + … + Fun(n-m) ①
Fun(n-1) = Fun(n-2) + Fun(n-3) + … + Fun(n-m-1) ②
将①和②结合一下:
Fun(n) = 2 * Fun(n-1) + Fun(n-m-1) (n>m)
上述的情况是当n>m时发生的,那么当n<=m时呢?
那问题就会转化为题目二的思路了。

4.2 代码实现

int Fun(int n, int m)
{if (n <= 1) //之所以是小于1,是因为m可能会大于n{return 1;}if(n>m){return 2 * Fun(n - 1, m) - Fun(n - m - 1, m);}return 2 * Fun(n - 1, n); //这里的n不要写成m
}int main()
{int n = 0;int m = 0;scanf("%d %d", &n, &m);int ret = Fun(n, m);printf("%d\n", ret);return 0;
}

后面的两道题希望读者们下来可以慢慢的去琢磨。

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

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

相关文章

Scanpy(3)单细胞数据分析常规流程

单细胞数据分析常规流程 面对高效快速的要求上,使用R分析数据越来越困难,转战Python分析,我们通过scanpy官网去学习如何分析单细胞下游常规分析。 数据3k PBMC来自健康的志愿者,可从10x Genomics免费获得。在linux系统上,可以取消注释并运行以下操作来下载和解压缩数据。…

Linux部署mysql8.0.28数据库

目录 1.基础准备 (1)首先去官网下载二进制安装包 (2)下载好之后上传至服务器 (3)禁用关闭selinux和防火墙 (4)挂载光盘搭建本地yum仓库 2.解压到指定目录 3.检查系统是否安装mariadb 4.安装MySQL数据库 (1)进入MySQL目录 看到‘完毕’就说面mysql已经安装成功了 4.初…

【Unity】RPG2D龙城纷争(一)搭建项目、导入框架、前期开发准备

更新日期&#xff1a;2024年6月12日。 项目源码&#xff1a;在第二章发布 免责声明&#xff1a;【RPG2D龙城纷争】使用的图片、音频等所有素材均有可能来自互联网&#xff0c;本专栏所有文章仅做学习和教程目的&#xff0c;不会将任何素材用于任何商业用途。 索引 【系列简介】…

人工智能在肿瘤预后预测中的最新研究进展|顶刊精析·24-06-07

小罗碎碎念 今天要分享的文献主题&#xff0c;大家一定非常熟悉&#xff0c;因为绝大多数AI4cancer的文章都会提到它——预后预测&#xff0c;所以今天的文献主题是——人工智能肿瘤预后预测。 在正式开始分享之前&#xff0c;我想先带着大家梳理两个问题。解决了以下两个问…

上传文件生成聊天机器人,实现客服、办公自动化智能体 | Chatopera

从谈论聊天机器人&#xff0c;到谈论智能体&#xff0c;是目前人工智能最炙手可热的话题&#xff0c;这两年最大的变化是大语言模型的应用。聊天机器人曾经很难定制&#xff0c;往往局限于个别行业&#xff0c;同时也只有行业内的领导者、头部企业能定制。比如银行、金融证券、…

【全开源】旅行吧旅游门票预订系统源码(FastAdmin+ThinkPHP+Uniapp)

&#x1f30d;旅游门票预订系统&#xff1a;畅游世界&#xff0c;一键预订 一款基于FastAdminThinkPHPUniapp开发的旅游门票预订系统&#xff0c;支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统&#xff0c;提供前后台无加密源码&#xff0c;支…

Android开机动画关闭流程

一步一图项目上要加一个开机动画结束的回调&#xff0c;我这边看下如何加 好&#xff0c;老规矩&#xff0c;如何启动动画&#xff1f;动画是谁启动的&#xff1f;怎么关闭的&#xff1f;谁通知关闭的 带着问题看源码 动画的启动流程 开机动画的主入口在哪&#xff1f; 这个…

讯飞星火模型-语音转文字实现

目录 项目结构 准备音频 接口Demo 准备代码&#xff08;完整修改后&#xff09; 测试提取中文文字代码 结果 下载链接&#xff1a; 这是上周打算试试&#xff0c;提取视频文字之后&#xff0c;制作视频字幕&#xff0c;从而想用大模型来实现&#xff0c;基本的demo可以在…

WPF音乐播放器 零基础4个小时左右

前言&#xff1a;winfrom转wpf用久的熟手说得最多的是,转回去做winfrom难。。当时不明白。。做一个就知道了。 WPF音乐播放器 入口主程序 FontFamily"Microsoft YaHei" FontSize"12" FontWeight"ExtraLight" 居中显示WindowStartupLocation&quo…

undetected_chromedriver驱动浏览器结束报错OSError: [WinError 6] 句柄无效

undetected_chromedriver驱动浏览器结束报错OSError: [WinError 6] 句柄无效 问题背景 使用undetected_chromedriver包驱动浏览器结束后报错句柄无效 Exception ignored in: <function Chrome.del at 0x000001DD50F07A60> Traceback (most recent call last): File “D:…

【React】json-server

1.安装到开发环境 npm install json-server -D2.在根目录下下&#xff0c;新建db.json文件 {"list": [{"rpid": 3,"user": {"uid": "13258165","avatar": "http://toutiao.itheima.net/resources/images/9…

clipboard.js(web页面实现点击复制)

文章目录 codeshow 一个很简单的需求&#xff0c;一个单页面需要一个点击复制的功能 后来在线上找到一个clipboard.js可以实现&#xff0c;这里只用到了最基础的用法&#xff0c;页面样式布局基于bootstrap5.2.3 code <div class"d-flex align-items-center justify-co…

【数据分享】《中国文化文物与旅游统计年鉴》2022

最近老有同学过来询问《中国旅游年鉴》、《中国文化文物统计年鉴》、《中国文化和旅游统计年鉴》、《中国文化文物与旅游统计年鉴》&#xff0c;这四本年年鉴的关系以及怎么获取这四本年鉴。今天就在这里给大家分享一下这四本年鉴的具体情况。 实际上2018年&#xff0c;为适应…

06 Linux 设备驱动模型

1、Overview Linux-2.6 引入的新的设备管理机制 - kobject 降低设备多样性带来的 Linux 驱动开发的复杂度,以及设备热拔插处理、电源管理等将硬件设备归纳、分类,然后抽象出一套标准的数据结构和接口驱动的开发,就简化为对内核所规定的数据结构的填充和实现驱动模型是 Linu…

【Three.js】知识梳理十:Three.js纹理贴图

1. 纹理贴图 在Three.js中&#xff0c;纹理贴图是一种将二维图像贴到三维物体表面的技术&#xff0c;以增强物体的视觉表现。纹理贴图可以使物体表面更加真实、细腻&#xff0c;为场景增色不少。 在Three.js中&#xff0c;纹理贴图的加载主要通过THREE.TextureLoader类实现。…

【C++ | 左值、右值】一文了解C++的左值、右值、左值引用()、右值引用()

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-12 1…

CSS真题合集(一)

CSS真题合集&#xff08;一&#xff09; 1. 盒子模型1.1 盒子模型的基本组成1.2 盒子模型的实际大小1.3 盒子模型的两种类型1.4 设置盒子模型1.5 弹性盒子模型 2. BFC2.1 主要用途2.2 触发BFC的方法2.2 解决外边距的塌陷问题&#xff08;垂直塌陷&#xff09; 3. 响应式布局3.1…

LWIP移植

目录 前言一、以太网协议简介1.1 TCP/IP协议简介1.2 STM32的ETH外设1.2.1 MAC子层1.2.2 SMI站管理接口1.2.3 MII和RMII接口 1.3 外部PHY芯片LAN87201.3.1 LAN8720 中断管理1.3.2 PHY 地址设置1.3.3 nINT/REFCLKO 配置1.3.4 LAN8720 内部寄存器 1.4 LWIP 简介 二、带操作系统的移…

pxe批量部署linux介绍

1、PXE批量部署的作用及必要性&#xff1a; 1&#xff09;智能实现操作系统的批量安装&#xff08;无人值守安装&#xff09;2&#xff09;减少管理员工作&#xff0c;提高工作效率3&#xff09;可以定制操作系统的安装流程a.标准流程定制(ks.cfg)b.自定义流程定制(ks.cfg(%pos…

北京医院共享轮椅小程序开发更贴心,更便捷

在大数据不断发展的今天&#xff0c;资源共享已随处可见&#xff0c;小到共享充电宝&#xff0c;共享雨伞&#xff0c;大到共享单车&#xff0c;汽车。这些常用资源的共享&#xff0c;充分实现了有限资源的最大化利用。 如今&#xff0c;众多北京医院&#xff0c;也结合自身实…