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

目录

    • 传统艺能
    • 过渡区
    • 正片开始
    • 描述
    • 分析
    • 实现
    • 格局打开

传统艺能

小编是大一菜鸟不赘述,欢迎大佬指点江山(QQ:1319365055)
此前博客点我!点我!请搜索博主 【知晓天空之蓝】点我!点我!请搜索博主 【知晓天空之蓝】或扫码进入!
乔乔的gitee代码库(打灰人 )欢迎访问,点我!
在这里插入图片描述

(https://blog.51cto.com)感谢支持!

过渡区

现在是北京时间13:03,只有下午有节英语课,昨晚看递归的题看到一点过,
所以早上起来精神状态不是很好就磨到现在才来写。今天早上没有遵守早期条约,把闹钟咕了,心情有点五味陈杂……
走进递归经典——青蛙跳台阶问题详解_第1张图片

正片开始

描述

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

走进递归经典——青蛙跳台阶问题详解_第2张图片

分析

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

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

规律出来后其实不难发现和我们之前研究的斐波那契似乎有些渊源,但又有不同,我暂且称它为特殊斐波那契数列,稍作对比:
斐波那契:
走进递归经典——青蛙跳台阶问题详解_第3张图片
呱太:
走进递归经典——青蛙跳台阶问题详解_第4张图片

实现

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

#include
  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级台阶)
走进递归经典——青蛙跳台阶问题详解_第5张图片

格局打开

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

#include
    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)}
    

今天就先到这里吧,溜了家人们

你可能感兴趣的:(c语言,c++,递归算法)