题目:青蛙上台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路:
青蛙如果跳一级台阶,则有一种跳法。跳二级台阶,则有两种跳法。跳三级台阶,则有三种跳法,跳四级台阶,则有五种跳法,跳五级台阶,则有八种跳法。
台阶数 | 跳法 |
---|---|
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
5 | 8 |
由结果很容易看出,这是一个斐波那契数列,满足当n>2时,第n个数等于第n-2个数与第n-1个数之和。也就是后面一个数等于前俩个数之和。因此该题也就有了多种解法,可以运用函数迭代的方法,也可以运用递归的方法,但此处运用递归会出现一些问题,具体问题自己可以去编译器去尝试一下,体验一下。
代码如下:
**利用函数迭代实现**
#include<stdio.h>
int fib(int n)
{
int a=1;
int b=1;
int c=0;
if (n < 2)
{
return 1;
}
while (n >= 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n;
int num = 0;
scanf("%d", &n);;
num = fib(n);
printf("有%d种跳法\n",num);
return 0;
}
**利用递归实现**
(此道题不建议使用)
#include<stdio.h>
int fib(int n)
{
if (n < 3)
{
return n;
}
else
{
return fib(n - 2) + fib(n - 1);
}
}
int main()
{
int n;
int sum = 0;
scanf("%d", &n);
sum = fib(n);
printf("有%d种跳法\n",sum);
return 0;
}
此处用递归并不如运用函数迭代,因为此时递归处理数据较多,重复数据计算多次,使得计算结果出来的变慢,且计算结果容易出错。
**在这里我们可以看一下计算重复数据的次数**
#include<stdio.h>
int count = 0;
int fib(int n)
{
if (n == 3)
count++;
if (n < 3)
{
return n;
}
else
{
return fib(n - 2) + fib(n - 1);
}
}
int main()
{
int n;
int sum = 0;
scanf("%d", &n);
sum = fib(n);
printf("有%d种跳法\n",sum);
printf("count = %d\n", count);
return 0;
}
通过结果可以看出,就仅仅计算第四十个数,第三个数就被计算了上千万次,并且计算结果时还耗费时间,且递归太深容易造成堆栈的溢出,计算结果并不能保证正确。
总结
递归的思路固然很棒,但并不是在任何情况下都是最优办法,有时运用递归反而会拖慢计算速度,所以运用递归之前要考虑解决对应问题时是否高效,但是递归这种思想一定要好好掌握。