青蛙为什么要跳台阶,C语言趣解青蛙跳台阶问题

⭐️前面的话⭐️

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
✉️坚持和努力一定能换来诗与远方!
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个n级的台阶总共有多少种跳法?
解题思路
1.当n=1的时,很明显青蛙只有一种跳法。
2.当n=2时,青蛙有两种选择,一是每次跳1级台阶,跳两次,二是直接跳两级台阶,一步到位。所以,一共有两种跳法。
3.当n>2时,我们不妨把上n级台阶的跳法记为一个函数f(n),青蛙在第一次跳的时候有两个选择,即跳一级台阶或跳两级台阶。当青蛙选择第一次跳一级台阶时,跳完后还剩n-1级台阶,在此情况下,跳法的数目为f(n-1);当青蛙选择第一次跳两级台阶时,跳完后还剩n-2级台阶,在此情况下,跳法数目为f(n-2)。所以,我们可以推出青蛙跳n级台阶的跳法总数为f(n)=f(n-1)+f(n-2)。

到这里我们就能使用求斐波拉契数列的方法来求青蛙跳n级台阶的跳法。

若把条件修改成一次可以跳一级,也可以跳2级…也可以跳上n级呢?
解题思路
尽管条件改成每次跳的台阶级数不受限,但是换汤不换药,思考的方法是一样的。
1.当n=1或n=2时,青蛙跳台阶跳法次数和没修改条件时是一样的,n=1有一种跳法,n=2有两种跳法。
2.当n>2时,同理我们将青蛙跳n级台阶时的跳法记成函数f(n)。但是青蛙在第一次的选择不仅仅是跳1级和跳2级,它还可以选择跳3,4,5,…,n级。所以青蛙跳一次后还会剩n-1,n-2,n-3,…,2, 1, 0级台阶。
此时,f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(2)+f(1)+1
同理,f(n-1)=f(n-2)+f(n-3)+f(n-4)+…+f(2)+f(1)+1
合并上面两个式子得,f(n)=2*f(n-1)
3.根据2的推论我们还可以进一步推导:
在这里插入图片描述

根据上面所推导出的结论,就能破解这个问题,写出代码

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//青蛙每次跳台阶数为1或2
// f(n)=f(n-1)+f(n-2)
//f(1)=1   f(2)=2

int frog_step1(int x);//递归
int frog_step2(int x);//非递归
//青蛙每次跳台阶数为任意值
//f(n-1)=f(n-2)+f(n-3)+...+f(1)
//f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)=2*f(n-1)
int rfrog_step1(int x);//递归
int rfrog_step2(int x);//非递归

int main()
{
	int n = 0;
	int cnt1 = 0;
	int cnt2 = 0;
	int cnt3 = 0;
	int cnt4 = 0;
	scanf("%d", &n);
	cnt1 = frog_step1(n);
	cnt2 = frog_step2(n);
	cnt3 = rfrog_step1(n);
	cnt4 = rfrog_step2(n);
	printf("青蛙跳%d级台阶一共有%d种跳法。\n", n, cnt1);
	printf("青蛙跳%d级台阶一共有%d种跳法。\n", n, cnt2);
	printf("青蛙跳%d级台阶一共有%d种跳法。\n", n, cnt3);
	printf("青蛙跳%d级台阶一共有%d种跳法。\n", n, cnt4);

	return 0;
}
//青蛙每次跳台阶数为1或2
// f(n)=f(n-1)+f(n-2)
//f(1)=1   f(2)=2
int frog_step1(int x)//递归
{
	if (x > 2)
		return frog_step1(x - 1) + frog_step1(x - 2);
	else if (x == 2)
		return 2;
	else if (x == 1)
		return 1;
	else
		return 0;

}
int frog_step2(int x)//非递归
{
	int a = 1;
	int b = 2;
	int ret = 1;
	if (x == 1 || x == 2 )
		ret = x;
	while (x > 2)
	{
		ret = a + b;
		a = b;
		b = ret;
		x--;
	}
	if (x > 0)
		return ret;
	else
		return 0;
}
//青蛙每次跳台阶数为任意值
//f(n-1)=f(n-2)+f(n-3)+...+f(1)
//f(n)=f(n-1)+f(n-2)+f(n-3)+...+f(2)+f(1)=2*f(n-1)
int rfrog_step1(int x)//递归
{
	if (x > 1)
		return 2 * rfrog_step1(x - 1);
	else if (x == 1)
		return 1;
	else
		return 0;
}
int rfrog_step2(int x)//非递归
{
	int a = 1;
	int ret = 1;
	while (x > 1)
	{
		ret = 2 * a;
		a = ret;
		x--;
	}
	if (x > 0)
		return ret;
	else
		return 0;
}

在这里插入图片描述

觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未见花闻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值