目录
一、问题描述
一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法?
二、思考过程
n=1,有1种跳法
n=2,有2种跳法
n=3,有3种跳法
n=4,有5种跳法
n=5,有8种跳法
......
这个数列为:1,2,3,5,8,......
我们发现:第n次的跳法数为第n-1次和第n-2次之和
类似于菲波那切数列的规律
三、用递归实现
#include <stdio.h>
int Fn(int n) {
if (n <= 2) {
return n;
}
else if (n > 2) {
return Fn(n - 1) + Fn(n - 2);
}
}
int main() {
int n = 0;
printf("请输入台阶数:");
scanf("%d", &n);
printf("共有%d种跳法\n", Fn(n));
return 0;
}
使用递归实现的代码效率太低,做了很多重复的计算。
四、用循环实现
#include <stdio.h>
int Fn(int n) {
int a = 1;
int b = 2;
int c = 0;
if (n == 1) {
return 1;
}
else if (n == 2) {
return 2;
}
else {
for (int i = 3;i <= n;i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
}
int main() {
int n = 0;
printf("请输入台阶数:");
scanf("%d", &n);
printf("共有%d种跳法\n", Fn(n));
return 0;
}
当输入的数较大时(如输入30),我们明显感觉到循环代码更快于递归代码。
五、输出结果
输入5
输入20
总结
青蛙跳台阶问题本质上就是斐波那契数列问题。因此,我们遇到新问题时要联想到以前的解决方法。
有的问题既可以用循环实现,也可以用递归来实现。递归更容易被我们想到,但有时递归代码的效率会不如循环代码。因此,要根据具体情况选择合适的方法。