题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法
分析:
1:当n=1时,只有一种跳法,即f(1)=1;
2: 当n=2时,有两种跳法,分别是-->第一次跳一个台阶,第二次只能跳一个台阶;
-->第一次跳两个台阶;
即f(2)=2;
3:依次类推,当n>2时,可以有两种选择,第一次跳一个台阶或跳两个台阶,
-->假设第一次跳的是一个台阶,剩下n-1个台阶,跳法为f(n-1)
-->假设第一次跳的是两个台阶,剩下n-2个台阶,跳法为f(n-2)
即f(n)=f(n-1)+f(n-2)
不难发现,这种情况很像斐波那契数列,斐波那契数列:1、1、2、3、5、8......而青蛙跳台阶问题为:1、2、3、5、8......,即可以通过递归的思想来解决这个问题
代码如下:
#include <stdio.h>
int leap(int n)
{
if (n <= 2)
{
return n;
}
else
{
return leap(n-2) + leap(n - 1);
}
}
int main()
{
int n = 0;
int num = 0;
scanf_s("%d", &n);
num=leap(n);
printf("%d\n", num);
return 0;
}
上述代码是通过递归的思想所写,但我们会发现,递归会重复计算已算过的值,效率不高
改进方法如下:
#include <stdio.h>
int leap(int n)
{
int x = 1;
int y = 2;
int z = 0;
while (n > 2)
{
z = x + y;
x = y;
y = z;
n--;
}
return z;
if (n <= 2)
{
return n;
}
}
int main()
{
int n = 0;
int num = 0;
scanf_s("%d", &n);
num=leap(n);
printf("%d\n", num);
return 0;
}
(拓展)变态跳台阶问题:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级......它也可以跳上n级。此时该青蛙跳上一个n级的台阶总共有多少种跳法?
分析:
1:当n=1时,只有一种跳法,即f(1)=1;
2: 当n=2时,有两种跳法,分别为-->一级一级跳;
-->直接跳两级;
即f(2)=2;
3: 当n>2时,第一次跳出一级后,后面还有f(n-1)中跳法; 第一次跳出两阶后,后面还有f(n-2)中跳法......第一次跳出n级后,后面还有 f(n-n)中跳法,即:
f(n) = f(n-1) + f(n-2) + f(n-3) + ... + f(n-n) = f(0) + f(1) + f(2) + ... + f(n-1)
又因为 f(n-1) = f(0) + f(2) + f(3) + ... + f(n-2)
两式相减得:f(n) = 2 * f(n-1) ( n > 2)
代码如下:
#include <stdio.h>
int leap(int n)
{
if (n <= 2)
{
return n;
}
else
{
return 2*leap(n - 1);
}
}
int main()
{
int n = 0;
int num = 0;
scanf_s("%d", &n);
num=leap(n);
printf("%d\n", num);
return 0;
}
今天的内容就分享到这儿,希望能够帮助到大家理解,也欢迎大家在评论区一起讨论。