今天主要研究如何解决青蛙跳台阶问题,分为以下两种方法
一、递归
二、循环
那么什么是青蛙跳台阶问题呢?接下来就介绍一下:
一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
下面就是通过C语言的方法来解决这个问题。
一、递归
首先对问题进行分析。当n>2时,我们可以设跳法总数为f(n),那么我们的目标就是找出f(n)的递推公式。那么应该怎么找呢?思路是这样的:
f(n)是跳n阶的总方法个数,那么在跳到第n个台阶之前只有两种可能,一种是在第n-1个台阶,另一种则是在第n-2个台阶,那么跳n阶的总方法个数不就是跳到第n-1个台阶的方法数和跳到第n-2个台阶的方法数之和吗?也就是f(n)=f(n-1)+f(n-2)这样我们就找到了递推公式。
当n=1时,则有1种,n=2,则有两种,由此我们可以写出代码:
#include<stdio.h>
int fang_fa_zong_shu(int n)
{
if (n == 1)
{
return 1;
}
else if (n == 2)
{
return 2;
}
else
{
return fang_fa_zong_shu(n - 1) + fang_fa_zong_shu(n - 2);
}
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = fang_fa_zong_shu(n);
printf("%d\n", ret);
return 0;
}
以上就是通过递归的方法解决青蛙跳台阶问题的思路和代码演示,方法不唯一 ,仅供参考。
二、循环
同样对问题进行分析,我们可以设跳2次的个数为x,跳1次的个数为y,则会有以下思路:
n可以由x和y表示,即n = 2x + y。由这个思路我们即可通过循环找出所有x和y的可能取值,然后再通过组合问题,用求出x,y在每种取值的所有顺序,再累加起来,就是方法的总数。
以下是代码演示:
#include<stdio.h>
int jie_cheng(int n)
{
int i = 0;
int sum = 1;
for (i = 1; i <= n; i++)
{
sum *= i;
}
return sum;
}
int zu_he(int x, int y)
{
int sum = 0;
sum = jie_cheng(x + y) / (jie_cheng(x) * jie_cheng(y));
}
int fang_fa_zong_shu(int n)
{
int x = 0;//跳2次的个数
int y = 0;//跳1次的个数
int sum = 0;
//n,x,y满足 n = 2x + y
for (x = 0; x <= (n / 2); x++)
{
y = n - 2*x;
int ret = 0;
ret = zu_he(x, y);//计算x,y组合个数
sum += ret;
}
return sum;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = fang_fa_zong_shu(n);
printf("%d\n", ret);
return 0;
}
总结
两种方法对比可知,递归代码量更少,更加方便阅读,但是运算量相较于循环也更大。而循环代码量更多,代码不方便阅读,但是运算量较小。
以上就是今天的学习内容了,感谢您的阅读,欢迎指出错误!