【递归】青蛙跳台阶的变式题你还会吗?

简介: 【递归】青蛙跳台阶的变式题你还会吗?

问题1:


如果青蛙一次只能跳一级或两级台阶,问跳到第N级台阶总共有多少方法?


解题:


跳上一级台阶,青蛙共有一种方法;0-->1,总共一种方法。


跳上两级台阶,青蛙可以一级一级跳,跳两次0-->1-->2,也可以直接跳到二级台阶,跳一次,0--->2;总共2种方法。


跳上三级台阶,青蛙可以青蛙可以一级一级跳,跳两次,0-->1-->2-->3,也可以先跳一级,然后再跳三级台阶,跳两次,0-->1--->3;也可以先跳两级,再跳一级台阶,跳两次,0-->2-->3;总共三种方法。


对于跳上三级台阶我们还可以从他跳上第三级台阶的最后一步来考虑(因为最后一步不一样,所以方法肯定不会重复),就是跳上三级台阶的方法数=跳上倒数第一级台阶的方法数+跳上倒数第二级台阶的方法数,这


那么我们便找到了普遍规律:


跳上N级台阶,得到递推公式f(n)=f(n-1)+f(n-2)


递推出口就是f(1)=1&&f(2)==2


这和斐波那契数列的结论很像,但是思考的过程却大相径庭!


代码:

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

结果:

image.png

看到这里我相信会了青蛙一次跳一级,两级台阶,但是稍微变一下,如果是青蛙可以一次跳一级,两级,三级台阶的问题,你是不是还会呐?


问题2:


如果青蛙一次可以跳1级,或2级,......或N级台阶,问青蛙要想跳到第N级台阶总共有多少种方法?


解题:


同样从他跳上第三级台阶的最后一步来考虑(因为最后一步不一样,所以方法肯定不会重复)


最后一步青蛙可以从倒数第一级,倒数第二......第二级,第一级台阶跳上去


因此得到公式f(n)=f(n-1)+f(n-2)+f(n-3)+....+f(2)+f(1);


同时f(n-1)=f(n-2)+f(n-3)+.....+f(2)+f(1);


得到递推公式f(n)=2*f(n-1);


代码:

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

结果:


bb3c5051994b40b4a672633192e237bc.png

问题3:


如果青蛙一次可以跳1级,或2级......或M级台阶,问青蛙要想跳到第N级台阶总共有多少种方法?(青蛙不能回跳)


解题:(分情况讨论)


1.当M>=N,因为青蛙不能回跳,所以此时问题等同于问题2;


2.当M<N,f(n)=f(n-1)+f(n-2)+f(n-3)+....+f(n-m)


同时f(n-1)=f(n-2)+f(n-3)+....+f(n-m)+f(n-m-1);


变换一下就是f(n-1)-f(n-m-1)=f(n-2)+f(n-3)+....+f(n-m)


因此得到递推公式:f(n)=2*f(n-1)-f(n-m-1)


代码同理可以写出来,自己动手试试吧!


目录
相关文章
|
5月前
|
数据采集 人工智能 自然语言处理
|
6月前
|
Ubuntu Linux 编译器
在Ubuntu Linux系统下如何搭建并安装EDK2
以上就是在Ubuntu Linux系统下搭建并安装EDK2的过程。这个过程可能会有些复杂,但只要按照步骤一步步来,应该不会有太大问题。如果在过程中遇到任何问题,都可以在网上找到相应的解决方案。希望这个指南能对你有所帮助!
239 17
|
机器学习/深度学习 自然语言处理 计算机视觉
YOLOv8改进 | 2023 | 给YOLOv8换个RT-DETR的检测头(重塑目标检测前沿技术)
YOLOv8改进 | 2023 | 给YOLOv8换个RT-DETR的检测头(重塑目标检测前沿技术)
850 0
|
Shell Android开发
Android11.0(R) MTK平台添加新分区
Android11.0(R) MTK平台添加新分区
2993 0
|
SQL 机器学习/深度学习 存储
什么是spark?通俗易懂,一文读懂
什么是spark?通俗易懂,一文读懂
704 0
什么是spark?通俗易懂,一文读懂
|
存储 前端开发
koa框架学习记录(7)
一个前端学习koa的简单记录
|
人工智能 JSON 文字识别
粤港澳大湾区(黄埔)国际算法算例大赛-古籍文档图像识别与分析(上)
粤港澳大湾区(黄埔)国际算法算例大赛-古籍文档图像识别与分析(上)
631 0
粤港澳大湾区(黄埔)国际算法算例大赛-古籍文档图像识别与分析(上)
|
算法 网络协议
|
SQL
SQL中 将同一个表中的A列更新到B列,B列更新到A列
原文:SQL中 将同一个表中的A列更新到B列,B列更新到A列 有网友在SKYPE问及,如标题,SQL中 将同一个表中的A列更新到B列,B列更新到A列。其实这个不是问题,直接写更新语句即可,可以参考下面动画演示: SQL source code: CREATE TABLE [dbo].
1140 0
|
Web App开发 C# 数据库
Matlab与.NET混编解决人脸识别问题
原文 http://www.cnblogs.com/asxinyu/archive/2013/05/29/3107013.html 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标。
1397 0