一、问题描述
一只青蛙一次可以跳上 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 ways(int n)
{
if (n<=2 )
{
return n;
}
else if (n>2)
return ways(n - 1) + ways(n - 2);
}
int main()
{
int n = 0;
//输入台阶数n
printf("输入的台阶数>:");
scanf("%d", &n);
//青蛙可以跳1-2格台阶跳n阶有多少种跳法//1阶1种;2阶2种;3阶3种;4阶5种;5阶8种,这样类似斐波那契数列
printf("青蛙可以跳%d台阶有%d方法", n, ways(n));
}
使用递归实现的代码效率太低,做了很多重复的计算。
四、用循环实现
#include<stdio.h>
int ways(int n)
{
int a = 0;
int b = 1;
int c = 0;
while (n>=1)
{
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main()
{
int n = 0;
//输入台阶数n
printf("输入的台阶数>:");
scanf("%d", &n);
//青蛙可以跳1-2格台阶跳n阶有多少种跳法//1阶1种;2阶2种;3阶3种;4阶5种;5阶8种,这样类似斐波那契数列
printf("青蛙可以跳%d台阶有%d方法",n,ways(n));
}