1.题目
一只青蛙跳一次只能跳1级台阶或跳2级台阶
求:该青蛙跳上第n级台阶总共有多少种跳法
例如:青蛙想跳至第二级台阶可以有两种跳法,一种是先跳一级再跳一级,另一种是直接跳两级台阶
2.分析与设计
2.1题目分析
题目中最关键的点是青蛙一次可跳1级台阶或2级台阶 ,根据这个点可以通过简单画图来求出一个规律性,设青蛙要跳上n级台阶,设func(n)为跳上n级台阶的跳法
可以得到以下的规律
2.2代码设计思路
青蛙有两种跳法,一种是跳到一级台阶,一种是跳上二级台阶
当n=1时:
- 只有一种跳法
当n=2时:
- 1.一级一级跳
- 2.另一种直接跳两级
当n=3时:
- 1.假设是先跳上一级台阶,那么剩下两级台阶,就是func(2)种跳法
- 2.假设是先跳上两级台阶,那么剩下一级台阶,就是func(1)种跳法
- 即func(3)=func(2)+func(1)
当n=4时:
- 1.假设先跳上一级台阶,剩下三级台阶,就是func(3)种跳法
- 2.假设先跳上两级台阶,剩下两级台阶,就是func(2)种跳法
- 即func(4)=func(3)+fun(2)
以此类推
当n级台阶时,func(n)=func(n-1)+func(n-2)
3. 代码实现
3.1递归
c
#include<stdio.h>
int func(int n)
{
if (n == 1)
return 1;
else if (n == 2)
return 2;
else
return func1(n - 1) + func1(n - 2);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = func(n);
printf("func(%d)=%d\n", n, ret);
return 0;
}
运行结果
画图推导
解释
c
func(4)=func(3)+func(2)
=func(2)+func(1)+func(2)
=func(2)+func(1)+2
=2+1+2
=5
3.2非递归
可以看到上面递归的方法进行了大量重复运算,当数值不太大的时候就会运算很久,因此可以使用非递归方法,避免大量重复计算,从而提高代码效率
c
#include<stdio.h>
int func(int n)
{
int a = 1;
int b = 2;
int c = 0;
if (n == 1)
return a;
else if (n == 2)
return b;
else
{
while (n - 2)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = func(n);
printf("func(%d)=%d\n", n, ret);
return 0;
}
运行结果
画图推导
可以看出,当n>2时,循环进行n-2次,每一次循环结束,n--, 直到n-2=0跳出循环,返回结果