经典递归 - 青蛙跳台阶问题

简介: 经典递归 - 青蛙跳台阶问题

题目要求:


一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)


->可认为是斐波那契数列



思路


情况1:如果只有一级台阶:显然只有一种跳法

情况2:如果有2级台阶,那么就有两种跳法。一种是分两次跳。每次跳1级,另一种就算一次跳2级

情况3:如果台阶级数大于2,设为n的话。这时我们把n级台阶时的跳法看成时n的函数,记为f(n) ,第一次跳的时候有两种不同的选择:一是第一次跳1级,此时的跳法的数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1),二是第一次跳2级,此时跳法的数目等于后面剩下的n-2级台阶的跳法数目,即为f(n-2),因此n级台阶的不同跳法的总数为:f(n) = f(n-1) + f(n-2),不难看出就是斐波那契数列。


数学函数表达式:

image.png


根据上面的函数,我们可以很容易写出代码!


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


延申1: 一次可以跳3个台阶


首先我们让青蛙一次可以跳3个台阶

1.当N=1时,有1种方法;

2.当N=2时,有2种方法;

3.当N=3时,青蛙可以选择第一步先跳1个台阶或者2个台阶或者3个台阶,有(1,1,1),(1,>2),(2,1),(3)  共四种方法;

4.当N=4时,青蛙选择第一步跳1层时,剩下3个台阶则时n=3时的方法; 青蛙第一步选择跳2层时,剩>下2个台阶则是n=2时的方法;  

青蛙第一步选择跳3层时,剩下一个台阶则是n=1时的方法;

所以当n=4时的所有方法为: n=3的所有方法 + n=2的所有方法 + n=1的所有方法; 以此类推,当>N=n时,n层台阶的方法为:n-1 层的方法 + n-2 层的方法 + n-3 的方法;


//一次跳3个台阶
#include<stdio.h>
int frog(int n)
{
   if(n == 1)
   {
      return 1;
   }
   if(n == 2)
   {
      return 2;
   }
   if(n==3)
   {
      return 4;
   }
   return frog(n-1) + frog(n-2) + frog(n-3);
}
int main()
{
   int n;
   scanf("%d",&n);
   int ways = frog(n);
   printf("%d\n",ways);
   return 0;
}
复制代码


延申2:一次可以跳k层台阶


我们再继续向下延申,若青蛙一次可以跳k层台阶呢?


很显然,经过上面的讨论,这个问题已经变得不那么复杂了,我们只需要计算出青蛙在跳 1 层台阶一>直到青蛙跳 k 层台阶分别有多少种方法,再利用递归,就会轻而易举的得到结果。

int frog(int n, int k)
{
   if(n == 1)
   {
      return 1;
   }
   if(n == 2)
   {
      return 2;
   }
   .......
   .......
   if(n == k)
   {
      return ?//跳 k 层台阶时的方法
   }
   return frog(n-1) + frog(n-2)+ ........+frog(n-k);
}
复制代码


相关文章
|
前端开发 Java 文件存储
JAVA 文件上传 和 下载
文件上传,也称为upload,是指将本地图片、视频、音频等文件上传到服务器上,可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛,我们经常发微博、发微信朋友圈都用到了文件上传功能。
|
4月前
|
Web App开发 人工智能 前端开发
AI 英语伴学 APP的开发技术
本项目打造商业级AI英语伴学APP,聚焦低延迟多模态音频交互与教育强管控。采用GPT-4o Realtime/Gemini Live实现&lt;1秒口语响应;LangGraph编排教学流程;WebRTC+前端DSP保障音质;驰声/微软发音评估、ElevenLabs童声TTS提升学习体验;Milvus向量库支撑个性化复习;Flutter跨端+Go/Python混合后端确保高并发与可扩展性。(239字)
|
3月前
|
存储 缓存 算法
Java在分布式ID生成器(Leaf——美团技术方案)中的实现
1.分布式ID的更高要求 雪花算法依赖时钟,存在回拨问题;数据库号段方案需要频繁访问DB。美团的Leaf方案提供了两种模式:号段模式(Leaf-segment)和雪花模式(Leaf-snowflake),均用Java实现https://zzblmyl.com,解决了上述痛点。
306 0
|
6月前
|
弹性计算 Ubuntu Linux
阿里云环境怎么使用代理ip
本文详解阿里云ECS上代理IP的两种核心用法:一是ECS通过外部代理访问网络(支持HTTP/HTTPS/SOCKS5及认证配置),二是ECS自建代理服务器(Squid或Dante),涵盖Linux/Windows环境变量设置、SDK代理调用、安全组开放、服务启停等完整操作步骤,兼顾安全与合规。
|
机器学习/深度学习 自然语言处理 JavaScript
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
在信息论、机器学习和统计学领域中,KL散度(Kullback-Leibler散度)是量化概率分布差异的关键概念。本文深入探讨了KL散度及其相关概念,包括Jensen-Shannon散度和Renyi散度。KL散度用于衡量两个概率分布之间的差异,而Jensen-Shannon散度则提供了一种对称的度量方式。Renyi散度通过可调参数α,提供了更灵活的散度度量。这些概念不仅在理论研究中至关重要,在实际应用中也广泛用于数据压缩、变分自编码器、强化学习等领域。通过分析电子商务中的数据漂移实例,展示了这些散度指标在捕捉数据分布变化方面的独特优势,为企业提供了数据驱动的决策支持。
2632 2
信息论、机器学习的核心概念:熵、KL散度、JS散度和Renyi散度的深度解析及应用
|
前端开发 JavaScript 搜索推荐
UniApp TabBar的巅峰之作:个性化导航的魅力
UniApp TabBar的巅峰之作:个性化导航的魅力
1973 0
|
存储 前端开发 测试技术
Android Kotlin中使用 LiveData、ViewModel快速实现MVVM模式
使用Kotlin实现MVVM模式是Android开发的现代实践。该模式分离UI和业务逻辑,借助LiveData、ViewModel和DataBinding增强代码可维护性。步骤包括创建Model层处理数据,ViewModel层作为数据桥梁,以及View层展示UI。添加相关依赖后,Model类存储数据,ViewModel类通过LiveData管理变化,而View层使用DataBinding实时更新UI。这种架构提升代码可测试性和模块化。
1045 2
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
1023 1
|
存储 Java 调度
Android面试题之Kotlin协程到底是什么?它是线程吗?
本文探讨了协程与线程的区别,指出协程并非线程,而是轻量级的线程替代。协程轻量体现在它们共享调用栈,内存占用少,仅需几个KB。协程切换发生在用户态,避免了昂贵的内核态切换。在Kotlin中,协程通过Continuation对象实现上下文保存,允许高效并发执行,而不会像线程那样消耗大量资源。通过`runBlocking`和`launch`示例展示了协程的非阻塞挂起特性。总结来说,协程的轻量主要源于内存占用少、切换开销低和高并发能力。
1052 0
|
Web App开发 人工智能 前端开发
Vercel 的 AI 工具 V0.dev 是什么?如何使用它?
# 网络开发者 # 人工智能 # javascript # 反应
9669 1

热门文章

最新文章