一只青蛙可以一次跳 1 级台阶或者一次跳 2 级台阶,例如:跳上第 1 级台阶只有一种跳法:直接跳 1 级即可。 跳上第 2 级台阶有两种跳法:每次跳 1 级,跳两次;或者一次跳 2 级。 问要跳上第 n 级台阶有多少种跳法?
#include<stdio.h>
int f(int);
int main()
{
int n;
printf("请输入__级台阶");
scanf_s("%d", &n);
printf("%d级台阶的跳法有:%d种",n,f(n));
return 0;
}
int f(int n) { //求n阶楼梯有多少种跳法的函数,那么n-1、n-2...阶楼梯的跳法也可以求出来了
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
else {
return f(n-1) + f(n-2);
}
}
可用循环迭代算法来改造递归:
int f(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
int result = 0;
int pre = 1;
int next = 2;
for (int i = 3; i < n + 1; i ++) {
result = pre + next;
pre = next;
next = result;
}
return result;
}
总结:分析问题我们需要采用自上而下的思维,而解决问题有时候采用自下而上的方式能让算法性能得到极大提升,思路比结论重要。