一、青蛙跳台问题:

1.问题描述:

一只青蛙可以1次跳1级台阶,也可以1次跳2级台阶,

如果青蛙要跳上n级台阶,共有多少种跳法?

2.思路:

函数递归-青蛙跳台问题_#define

函数递归-青蛙跳台问题_#include_02

我们可以先把1~4级台阶的跳法计算出来,看看这之间是否存在着一定的规律。

假设现在青蛙要跳5级台阶,那么第一步无非就两种情况,

①当第一步选择跳1级台阶时,还剩下4级台阶,这时,我们会发现,

前面已经把4级台阶的跳法计算出来了,所以说剩下4级台阶的跳法就是5种;

②当第一步选择跳2级台阶时,同理,剩下3级台阶,跳法有3种。

综上,5级台阶跳法为3+5=8种,也就是说,

n级台阶的跳法 = (n-1)级台阶的跳法 + (n-2)级台阶的跳法

这里实际上涉及到一个动态规划的思想:

用上一步的结果,来快速计算得到下一步的结果。

3.规律总结:

假设青蛙要跳n级台阶,当青蛙首跳为1阶,则剩下n-1级台阶,

记n-1级台阶跳法为F(n-1),

同理剩下n-2级台阶时,n-2级台阶跳法为F(n-2);

由此可得n级台阶跳法如下:

F(n)=F(n-1)+F(n-2);

这时我们会发现,这不就是变种的斐波那契数吗?但是用递归的方法比较耗费资源,

采用常规方法运算会快一点。

这个在之前发布的一篇文章上有提及:函数和递归(3)

代码编写如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int frog(int x)
{
    int a = 1;
    int b = 2;
    int c = a;
    while (x > 2)
    {
        c = a + b;
        a = b;
        b = c;
        x--;
    }
    return c;
}
int main()
{
    int n = 0;
    printf("请输入青蛙要跳的台阶数>:");
    scanf("%d", &n);
    int ret = frog(n);
    printf("青蛙跳%d级台阶,共有%d种跳法\n", n, ret);
    return 0;
}


二、青蛙跳台问题变种:

1.问题描述:

一只青蛙,一次可跳1/2/3.../n级台阶,问该青蛙跳上n级台阶有多少种跳法?

2.思路与规律总结:

函数递归-青蛙跳台问题_递归_03

同上假设,若首跳为1阶,剩n-1阶,即剩F(n-1)种跳法,如此递推可得:

F(n)=F(n-1)+F(n-2)+...+F(2)+F(1)+F(0)

∵F(n-1)=F(n-2)+F(n-3)+...+F(2)+F(1)+F(0)

F(n)=2*F(n-1)

代码编写如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int frog(int x)
{
    if (x <= 3)
        return x;
    if (x > 3)
        return 2 * frog(x - 1);
}

int main()
{
    int n = 0;
    printf("请输入青蛙要跳的台阶数>:");
    scanf("%d", &n);
    int ret = frog(n);
    printf("青蛙跳%d级台阶,共有%d种跳法\n", n, ret);
    return 0;
}