一、题目:
一个青蛙一次只能向上跳一级或者跳两级台阶
问:这个青蛙跳上n级台阶有多少种跳法
二、解题:
分析:
我们将跳法的个数叫做F(n),不妨从n比较下的时候寻找一下规律
n | F(n) |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
5 | 8 |
6 | 13 |
7 | 21 |
往下列举不难发现每一项都是其前面两项的和,所以这个问题就可以看作从第二项开始的斐波那契数列
那么为什么会这样呢?
想要跳到第n级台阶,无非就是从第n-1级台阶向上跳一级,或者从第n-2级台阶往上跳两级,即
F(n)=F(n-1)+F(n-2),以此类推,F(n-1)=F(n-2)+F(n-3)…直到n=1,2 F(1)=1,F(2)=2;
这就是函数的递归:当我们想要的到这个函数的结果时需要再次调用者函数。
代码的实现
int frog_times(int a)
{
if (1 == a)
return 1;
if (2 == a)
return 2;
if (a > 2)
return frog_times(a - 1) + frog_times(a - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("跳到第%d级台阶共有%d种跳法\n ", n, frog_times(n));
return 0;
}
但是我们在运行较大的数时发现,同一个frog_times会被重复计算许多次
可以发现当n=40时F(3)被计算了39088169次!!!!这大大拖慢了程序的进程
实际上我们只需要计算一次F(3)即可,下面是优化的代码
int frog_times(int i)
{
int a = 1;
int b = 2;
int c = 0;
while (i > 2)
{
c = a + b;
a = b;
b = c;
i--;
}
if (a == 1)
return a;
if (b == 2)
return b;
return c;
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("跳到第%d级台阶共有%d种跳法\n ", n, frog_times(n));
return 0;
}