青蛙跳台阶问题(C语言)

        

☆ Welcome to House's blog ! ☆

本人主页:神王豪斯(重拾基础期)-CSDN博客

所属专栏:重拾C语言——神王降世的第一步!_神王豪斯(重拾基础期)的博客-CSDN博客

一、题目描述

假设一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级台阶。求青蛙跳上一个 n 级台阶总共有多少种跳法。

二、题目分析

和汉诺塔问题分析一样 Tower Of Hanoi - 汉诺塔问题(C语言)-CSDN博客 (链接放在这里啦,点一下咱们直接穿越~),由浅入深,观察台阶阶数由1到3青蛙的跳法:

青蛙跳台阶问题(C语言)_第1张图片

台阶阶数为一时,青蛙只有一种跳法;

台阶阶数为二时,有一次跳一级、一次性跳两级两种跳法;

台阶阶数为三时,有一次跳一级、先跳两级再跳一级、先跳一级再跳两级三种方法;

...

现在让我们仔细观察台阶阶数为三的第三种情况:

当青蛙第一次只跳一级台阶,它还面对两级台阶,然而我们刚刚已经数出来了在这种情况下青蛙有两种跳法;

青蛙跳台阶问题(C语言)_第2张图片

当青蛙第一次跳两级台阶,他还面对一级台阶,此时只有一种跳法;

青蛙跳台阶问题(C语言)_第3张图片

因此,我们不难发现,青蛙面对三级台阶时的跳法实际上便是面对一级台阶跳法与面对两级台阶跳法之和,同理,在面对更多的台阶时也是相同的情况,要求n级台阶的跳法,我们便需要先知道(n-1)级与(n-2)级台阶的跳法共有多少种。

由此,我们便可得出解决此问题的大致框架:

青蛙跳台阶问题(C语言)_第4张图片

看到这里想必绝世聪慧的你已经看出来了,这完全就是斐波那契数列,唯一的不同点只是最开始的两个数值不一样。

三、代码实现

FrogJumpSteps函数实现如下:

int FrogJumpSteps(int n)
{

	if (n == 1 )
	{    
		return 1;
	}
	else if (n == 2)
    {
		return 2;
	}
	else
    { 
		return (FrogJumpSteps(n - 1) +FrogJumpSteps(n - 2));
	}

}

所有代码~

#include


int FrogJumpSteps(int n)
{
	if (n == 1 )
	{
		return 1;
	}
	else if (n == 2)
	{
		return 2;
	}

	else {
		return (FrogJumpSteps(n - 1) +FrogJumpSteps(n - 2));
	}

}



int main()
{
	int x = 0;

	printf("有几级台阶?\n");

	scanf("%d", &x);

	printf("%d\n", FrogJumpSteps(x));
	
	return 0;
}

运行效果~

青蛙跳台阶问题(C语言)_第5张图片         青蛙跳台阶问题(C语言)_第6张图片

四、动态规划思路

  • 首先在函数 frogJumpSteps 中,对输入的台阶数 n 进行判断和处理。当 n 小于等于 0 时返回 0,当 n 为 1 时返回 1,当 n 为 2 时返回 2。
  • 定义一个大小为 n + 1 的整数数组 dp ,并初始化 dp[1] 为 1(表示一阶台阶的跳法数量),dp[2] 为 2(表示两阶台阶的跳法数量)。
  • 通过一个循环,从第 3 级台阶开始,计算每级台阶的跳法数量。对于第 i 级台阶,其跳法数量 dp[i] 等于第 i - 1 级台阶的跳法数量 dp[i - 1] 加上第 i - 2 级台阶的跳法数量 dp[i - 2] 。
  • 最后返回 dp[n] ,即 n 级台阶的跳法数量。
  • 在 main 函数中,接收用户输入的台阶阶数 n ,调用 frogJumpSteps 函数计算并输出跳上 n 级台阶的方法数。
#include 

int frogJumpSteps(int n) {
    if (n <= 0) {
        return 0;
    }
    if (n == 1) {
        return 1;
    }
    if (n == 2) {
        return 2;
    }

    int dp[n + 1];
    dp[1] = 1;//一阶台阶跳法数量
    dp[2] = 2;//两阶台阶跳法数量

    for (int i = 3; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }

    return dp[n];
}

int main() {
    int n = 0;
    printf("请输入台阶阶数:\n");
    scanf("%d",&n);
    int result = frogJumpSteps(n);
    printf("跳上 %d 级台阶的方法数: %d\n", n, result);
    return 0;
}

五、文末小结

那到这里为止我们对青蛙跳台阶问题的两种解法——函数递归与动态规划的分享就完成了,总结一下:

 递归解法通过分析得出跳 n 级台阶的跳法是跳 n - 1 级和 n - 2 级跳法之和,根据不同台阶数返回不同跳法数量,但可能存在效率问题。

动态规划解法先对特殊台阶数初始化,然后通过循环从第 3 级台阶开始,利用前面台阶的跳法数量计算当前台阶跳法数量,最后返回指定台阶的跳法数量,效率更高,避免了重复计算。 

十分感激你看到这里,如果本篇内容对你有所启发的话就麻烦点个赞吧(虔诚脸),你的点赞、收藏、关注都是对我莫大的鼓励~

后续还会根据数据结构的知识继续更新函数递归的相关分享,敬请期待!

再次感谢你的观看,让我们下次再见!

你可能感兴趣的:(c语言,开发语言)