青蛙跳台阶问题是计算机科学中的一个经典问题,也被称为斐波那契数列问题。具体来说,问题描述是这样的:
一只青蛙可以一次跳一级台阶,也可以一次条两级台阶,如果青蛙要跳上n级台阶,共有多少种跳法
这个题是一个典型的斐波那契数列,斐波那契数列是一种非常著名的数字序列,其特点是每一项都是前两项的和.在这个问题中,我们可以把每个台阶看作斐波那契数列中的一项。
首先我们先用递归的方法:
#include<stdio.h>
int function(int n)
{
if(n==1)
return 1;
else if(n==2)
return 2;
else
return function(n-1)+function(n-2);
}
int main()
{
int x=0;
scanf("%d",&x);
int ret=function(x);
printf("function(%d)=%d\n",x,ret);
return 0;
}
显然这个运行结果是正确的
方法二:循环
#include<stdio.h>
int function(int n)
{
int i=1;
int j=2;
int tmp=0;
if(n==1)
return i;
else if(n==2)
return j;
else
{
while(n-2)
{
tmp=i+j;
i=j;
j=tmp;
n--;
}
return tmp;
}
int main()
{
int x=0;
scanf("%d",&x);
int ret=function(x);
printf("function(%d)=%d\n",x,ret);
return 0;
}
运行结果与上一个是相同的没有任何问题
因此我们可以通过循环或递归的方式解决这个问题。但是循环和递归的方式效率较低,因为存在大量的重复计算。为了提高效率,我们可以采用动态规划的方法,即预先计算并存储一些特定的跳法数,然后用这些已知的跳法数来推算其他的跳法数。
#define MAX 100
int function(int number)
{
int con = (int)1e9 + 7;
if (number == 1)
return 1;
else if (number == 2)
return 2;
else
{
int dp[MAX];
dp[1] = 1;
dp[2] = 2;
int i = 0;
for (i = 3; i <= number; i++)
{
dp[i] = dp[i - 1] % con + dp[i - 2] % con;
}
return dp[number];
}
}
int main()
{
int x=0
scanf("%d", &x);
int ret = function(x);
printf("function(%d)=%d\n", x, ret);
return 0;
}
在实际应用中,这个问题常常被用来解释和演示动态规划和递归的思想,以及他们在解决实际问题中的应用。
本次分享就到这里,感谢大家观看和关注!