题目
一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
思考
如果只有一节台阶,那么小青蛙只有一种跳法
如果有两阶台阶,那么小青蛙有两种跳法
台阶数n | 跳法f(n) |
1 | 1 |
2 | 2 |
递归思想
如果n=3,通过列举我们得出f(n)=3
第一种:1 1 1
第二种:1 2
第三种:2 1
通过观察发现,如果我们不考虑小青蛙在前面是如何跳的,那么小青蛙的最后一步可以分为两种情况:从倒数第二阶跳2到终点和从倒数第一阶跳1到终点;当我们把小青蛙的最后一步分成两种情况后,我们只需要分别考虑小青蛙在前(3-2)级台阶和前(3-1)级台阶中有多少种跳法
第一种情况:把台阶分成了最后2级台阶和前(3-2)级台阶,而前(3-2)级台阶有多少种跳法呢?通过上面的表格中,我们知道f(3-2)=f(1)=1;即第一种情况小青蛙只有1种跳法。
第二种情况:同理,我们得知,f(3-1)=2,即在这种情况下,小青蛙有两种跳法。
台阶n | f(n) |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | ? |
我们用刚才的思想,计算一下n=4的时候,小青蛙有多少种算法
第一种情况:最后2级台阶和前(4-2)级台阶,f(4-2)=f(2)=2
第二种情况:最后1级台阶和前(4-1)级台阶,f(4-1)=f(3)=3
f(4)=f(2)+f(3)=5,经过列举法我们发现,结果正确。
由此,我们发现,小青蛙跳台阶的问题,本质上就是斐波那契数列的问题,我们利用递归的思想,将跳n级台阶的问题转化为跳(n-1)级台阶和跳(n-2)级台阶这两种情况的总和,那么我们就可以很轻松的写出代码。
代码
#include<stdio.h>
int Fib(int n)
{
if (n <= 2)
return n;
if (n > 2)
{
return Fib(n - 1) + Fib(n - 2);
}
}
int main()
{
int n = 0;
int f = 0;
printf("小青蛙要跳多少级台阶:>");
scanf("%d", &n);
f=Fib(n);
printf("小青蛙一共有%d种跳法\n", f);
return 0;
}
通过代码,我们迅速得出
台阶n | f(n) |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
5 | 8 |
6 | 13 |
7 | 21 |
8 | 34 |
9 | 55 |
10 | 89 |
... | ... |