走进递归经典——青蛙跳台阶问题详解

简介: 描述👏继汉诺塔问题之后,接下来就是青蛙跳台阶问题:​说一只青蛙一次可以跳上1级,也可以跳上2级,求该青蛙跳上一个n级的台阶总共有多少种跳法。刚开始感觉像是在算阶乘,考虑先后次序不同算不同的结果嘛;看完才发现我格局低咯,这题其实蛮有意思。

image.png

分析👏

不同的结果嘛;细想就发现我格局低了,这题其实很有意思。


那么我们先分析一下,我青蛙只能跳1或2级,一级台阶只有一种;跳二级时,可跳两次一级或跳一次二级;跳3级时,跳一个二级和一个一级,即二级台阶跳法+一级台阶跳法;跳四级时,先跳一级后,剩三级台阶;或先跳两级,剩二级台阶,可能性就是三级台阶跳法+二级台阶跳法……


规律出来后其实不难发现和我们之前研究的斐波那契似乎有些渊源,但又有不同,我暂且称它为特殊斐波那契数列,稍作对比:

斐波那契:

image.png

image.png

实现👏

知道原理和模型就不难理解问题的本质,接下来就是衔接与打磨。这里我们先自义定一个 Frog函数来模拟情景:

#include<stdio.h>
  int Frog(int n)
  {
    if (n == 1)
    {
      return 1;
    }
    if (n == 2)
    {
      return 2;
    }
    return Frog(n - 1) + Frog(n - 2);//大于2级台阶就进入递归部分
  }
  int main()
  {
    int n = 0;
    printf("please input the number of steps:");
    scanf("%d", &n);
    int num = Frog(n);//传参开始计算
    printf("%d\n", num);
    return 0;
  }

执行结果如下图所示:(假设为6级台阶)

image.png

格局打开👏

以上只是针对的是初始步数对应为n =1或n=2时,我们继续深入思考一下,n更大时,n=3,4,5,……,m 时又该怎么办呢?当n = n 时,共有n种跳的方式,第一次跳出一阶后,后面还有Fib(n-1)中跳法; 第一次跳出二阶后,后面还有Fib(n-2)中跳法…第一次跳出n阶后, 后面还有 Fib(n-n)中跳法.这时候我们可以把函数部分再补充一下如下:

#include<stdio.h>
    int Frog(int n,int m)
    {
        if (n == 1)
        {
            return 1;
        }
        if (n == 2)
        {
            return 2;
        }
        if (n == 3)
        {
            return 4;
        }
    ……
    ……
        if(n==m)
        {
        return ?;  //(跳m级台阶方案)
        }
    Frog(n-1)+Frog(n-2)+Frog(n-3)+……+Frog(n-m);
    }


相关文章
|
算法 Android开发 Python
LeetCode 周赛上分之旅 #43 计算机科学本质上是数学吗?
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
83 0
LeetCode 周赛上分之旅 #43 计算机科学本质上是数学吗?
|
8月前
|
机器学习/深度学习
技术经验解读:【最小生成树】新的开始(newstart)解题报告
技术经验解读:【最小生成树】新的开始(newstart)解题报告
43 0
|
8月前
【洛谷 P1002】[NOIP2002 普及组] 过河卒 题解(递归+记忆化搜索)
`NOIP2002`普及组的过河卒问题是一个棋盘路径计数挑战。卒从$(0,0)$出发到$(n,m)$,只能向下或向右移动,马在$(c1,c2)$固定,控制某些点。任务是计算不受马阻挡的路径数。输入是目标和马的位置,输出是路径总数。使用动态规划和记忆化搜索避免重复计算,样例输入$(6,6,3,3)$输出$6$。代码中定义了$f(x,y)$计算$(x,y)$处的路径数,利用边界条件和递推关系计算。
96 0
|
8月前
|
算法 容器
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
【经典LeetCode算法题目专栏分类】【第1期】左右双指针系列:盛最多水的容器、接雨水、回文子串、三数之和
|
8月前
|
存储 算法 数据挖掘
力扣18题 四数之和:从基础到精通,一篇文章带你突破算法难关
力扣18题 四数之和:从基础到精通,一篇文章带你突破算法难关
|
9月前
|
C++
栈和队列经典笔试题
栈和队列经典笔试题
|
算法 Java 测试技术
LeetCode 周赛上分之旅 #46 经典二分答案与质因数分解
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
80 0
LeetCode 周赛上分之旅 #46 经典二分答案与质因数分解
蓝桥杯备赛leetcode 70.爬楼梯,用最经典的题目来讲解动态规划
题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼梯顶部呢?
蓝桥杯备赛leetcode 70.爬楼梯,用最经典的题目来讲解动态规划
|
存储 算法 C语言
深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。
深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。
|
存储
第一期:栈的经典例题
第一期:栈的经典例题
170 0

热门文章

最新文章