一、青蛙跳台问题:
1.问题描述:
一只青蛙可以1次跳1级台阶,也可以1次跳2级台阶,
如果青蛙要跳上n级台阶,共有多少种跳法?
2.思路:
我们可以先把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.思路与规律总结:
同上假设,若首跳为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;
}