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

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

题目要求:


一只青蛙一次可以跳上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);
}
复制代码


相关文章
|
7月前
|
Java
【汉诺塔】经典递归问题(Java实现)图文并茂讲解
【汉诺塔】经典递归问题(Java实现)图文并茂讲解
|
7月前
|
存储 测试技术 C++
二叉树——经典练习题
二叉树——经典练习题
|
2月前
|
算法 定位技术
数据结构与算法学习九:学习递归。递归的经典实例:打印问题、阶乘问题、递归-迷宫问题、八皇后问题
本文详细介绍了递归的概念、重要规则、形式,并展示了递归在解决打印问题、阶乘问题、迷宫问题和八皇后问题等经典实例中的应用。
52 0
经典递归问题:汉诺塔【超详解】
经典递归问题:汉诺塔【超详解】
622 0
递归经典例题——汉诺塔
递归经典例题——汉诺塔
114 1
|
算法
解密汉诺塔问题:递归与分治的经典探索
解密汉诺塔问题:递归与分治的经典探索
593 0
|
算法 C语言
糊里糊涂的递归和递归经典题(上)
糊里糊涂的递归和递归经典题
糊里糊涂的递归和递归经典题(下)
糊里糊涂的递归和递归经典题(下)
初阶函数递归经典例题(1)
初阶函数递归经典例题(1)
|
机器学习/深度学习
青蛙跳台阶(递归)
青蛙跳台阶(递归)
100 0