青蛙跳台阶问题
作者:互联网
目录
青蛙跳台阶:
一只青蛙一次可以跳 1 级台阶,也可以跳 2 级台阶。
求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
示例1:
输入 :
n = 0
输出 : 1
示例2 :
输入 :
n = 2
输出 : 2
示例3 :
输入 :
n = 7
输出 : 21
分析:
- 如果只有 1 级台阶,就只有 1 种跳法;
- 如果有 2 级台阶,就有 2 种跳法;
- 如果有 n 级台阶(n>2),这时我们把跳法设为 函数f(n)。跳到第 n 节台阶前的位置,一定是在第(n-1)个台阶或者第(n-2)个台阶上,所以f(n) = f(n-1) + f(n-2),不难看出这很符合斐波那契数列的思想。
代码:
#include <stdio.h>
int ways(int n)
{
if (n <= 1)
return 1;
else
return ways(n - 1) + ways(n - 2);
}
int main()
{
int n = 0;
printf("输入: n = ");
scanf("%d", &n);
int ret = ways(n);
printf("输出: %d\n", ret);
return 0;
}
变态跳台阶
若把条件修改成一次可以跳一级,也可以跳2级…也可以跳上n级呢?
分析:
-
如果台阶数为 n 的话,这时我们把跳法设为 函数f(n)。第一次跳的时候有 n 种不同的选择:若第一次跳一级,此时跳法的数目等于后面剩下的 n-1 级台阶的跳法数目, 即为 f(n-1),若是第一次跳 m (m<n)级,此时跳法的数目等于后面剩下的 n-m 级台阶的跳法数目,即为 f(n-m),若是第一次跳 n 级,此时跳法的数目等于1。所以 f(n) = f(n-1) + f(n-2) + … + f(n-m) + … + f(2) + f(1) + f(0);
-
因此 f(n-1) = f(n-2) + … + f(n-m) + … + f(2) + f(1) + f(0);
-
两式相减得到 f(n) = 2 * f(n-1);
-
因此可以得到下面的结果
代码:
#include <stdio.h>
int ways(int n)
{
if (n <= 1)
return 1;
else
return 2 * ways(n - 1);
}
int main()
{
int n = 0;
printf("输入: n = ");
scanf("%d", &n);
int ret = ways(n);
printf("输出: %d\n", ret);
return 0;
}
希望可以对大家有所帮助,如果有什么不对的地方,还烦请指教,谢谢!
标签:台阶,int,青蛙,跳法,问题,ways,ret,printf 来源: https://blog.csdn.net/qq_45691717/article/details/120314737