青蛙跳台阶问题:青蛙有两种跳台阶的跳法,它可以一次跳一级台阶,也可以一次跳两级台阶,问青蛙跳n级台阶有多少种跳法?
解题思路:
首先我们先从青蛙跳到第三个台阶时有多少种跳法开始探讨:
情况1:如果青蛙跳第一次跳台阶跳一级台阶:
那么当青蛙到达第1个台阶,由第1个台阶跳向第3个台阶时,相当于从平台跳向第2个台阶,
他们的跳法是相同的,而我们很容易知道跳2个台阶的跳法有2种,如图:
那么
情况一结论:
跳到3级台阶的跳法等价于跳到1级台阶的跳法加上跳到2级台阶的跳法
情况2:如果青蛙跳第一次跳台阶跳两级台阶:
那么当青蛙到达第2个台阶,由第2个台阶跳向第3个台阶时,相当于从平台跳向第1个台阶,
他们的跳法是相同的,而我们很容易知道跳1个台阶的跳法有1种,如图:
那么
情况二结论:
跳到3级台阶的跳法等价于跳到1级台阶的跳法加上跳到2级台阶的跳法
得出最后结论:
从情况一和情况二不难看出他们的跳法都是相同的:跳到3级台阶的跳法等价于跳到1级台阶的跳法加上跳到2级台阶的跳法,由此我们很容易可以推导出青蛙跳更高台阶的跳法情况:跳到4级台阶的跳法等价于跳到2级台阶的跳法加上跳到3级台阶的跳法,跳到5级台阶的跳法等价于跳到3级台阶的跳法加上跳到4级台阶的跳法......以此类推,最后得出结论:跳到n级台阶的跳法等价于跳到(n-2)级台阶的跳法加上跳到(n-1)级台阶的跳法。
代码如下:
【代码1---递归】
//青蛙跳台阶问题
//法一:递归
#include <stdio.h>
int FrogJum(int n)
{
if (1 == n)
{
return 1;
}
else if (2 == n)
{
return 2;
}
else
{
return FrogJum(n - 1) + FrogJum(n - 2);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int sum = FrogJum(n);
printf("%d\n", sum);
return 0;
}
【代码2---迭代】
//青蛙跳台阶问题
//法二:迭代
#include <stdio.h>
int FrogJum(int n)
{
if (1 == n || 2 == n)
{
return n;
}
else
{
int i = 0;
int a = 1;
int b = 2;
int c = 0;
for (i = 3; i <= n; i++)
{
c = a + b;
a = b;
b = c;
}
return c;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int sum = FrogJum(n);
printf("%d\n", sum);
return 0;
}
编译情况:
输入 : 10
输出 : 89
---------------------