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

题目要求:


一只青蛙一次可以跳上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),不难看出就是斐波那契数列。


数学函数表达式:

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


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


#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);
}
复制代码


上一篇:你想知道的数组易错知识都在这了-C


下一篇:一道百度经典的笔试题-大小端的判断