其他分享
首页 > 其他分享> > 青蛙跳台阶问题

青蛙跳台阶问题

作者:互联网

目录


青蛙跳台阶:

一只青蛙一次可以跳 1 级台阶,也可以跳 2 级台阶。

求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

示例1:

输入 : n = 0

输出 : 1

示例2 :

输入 : n = 2

输出 : 2

示例3 :

输入 : n = 7

输出 : 21

分析:

  1. 如果只有 1 级台阶,就只有 1 种跳法;
  2. 如果有 2 级台阶,就有 2 种跳法;
  3. 如果有 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级呢?

分析:

  1. 如果台阶数为 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)

  2. 因此 f(n-1) = f(n-2) + … + f(n-m) + … + f(2) + f(1) + f(0)

  3. 两式相减得到 f(n) = 2 * f(n-1)

  4. 因此可以得到下面的结果

    image-20210915183545921

代码:

#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