汉诺塔和青蛙跳台问题

🛸作者:爱编程的小赵

⛽加油站:遇到困难时不要抱怨,既然改变不了过去,那么就努力改变未来。

✍专栏:C语言小游戏


文章目录

💎前言

👀青蛙跳台问题是什么

🏹如何思考青蛙跳台问题

🚅解决青蛙跳台问题

👀汉诺塔问题是什么

🏹如何思考汉诺塔问题

🚅解决汉诺塔问题

🌍结束语


💎前言

各位CSDN的大家好啊,今天小赵要分享给各位的c语言小游戏是青蛙跳台阶问题🐱‍🐉和汉诺塔问题🧐,这个问题主要针对的是C语言中函数递归问题,相信有不少小伙伴是听说过的,那么今天小赵就带着大家来看看这两个问题吧🐱‍🚀。

👀青蛙跳台阶问题是什么

首先我们先来看一下青蛙问题是什么

一只青蛙可以一次跳 1 级台阶或一次跳 2 级台阶,问要跳上第 n 级台阶有多少种跳法?

🏹如何思考青蛙跳台阶问题

 相信不少人看到青蛙跳台阶问题后,脑子是很懵的不知道该如何思考。在这里小赵想告诉您,只要您坚定地迈出第一步,相信任何问题都是可以解决的,我们不能被纸面上的老虎打败🤺,要勇敢地战胜它。

首先,我们可以把大问题化小问题,我们可以先想如果只有一个台阶,青蛙怎么跳,答案很明显只有一种。那如果两个台阶呢,也很明显只有两种。接着我们再来试试三个台阶,我相信这难不倒你,如果你数得没错应该是三种这个时候你是否会有一种错觉就是几个台阶,就是跳几步呢?😬但当你数到第四个时候你就会发现你的规律没了,那这时候该咋办呢?

别急小赵这就为你解决,我们可以就四个台阶来分析,我们先看第一步,我们是不是只有两种跳法,,那如果我们坚定地跳出第一步还有几个台阶呢,答案是三个,那问题不就回到前面了,我们一看3个台阶明显是三个,那如果我们第一步跳两个呢,那下一步不就只有2个台阶了吗,那不就是两种吗,那我们4个台阶不就应该是前两种之和吗?瞬间我们的思路是不是就打开了

🚅解决青蛙跳台阶问题

既然知道了它的整个做题思路,那么用C语言的递归解决就很简单了,也容易得出表达式f(n)=f(n-1)+f(n-2);

//青蛙跳台
int F(int n)//n为多少个台阶
{
	if (n == 1)//一个台阶
		return 1;
	else if (n == 2)//两个台阶
		return 2;
	else
		return F(n - 1) + F(n - 2);//表达式F(n)=F(n-1)+F(n-2);即这一次为前两次的和(跳一个或跳两个)

}
int main()
{
	int a = 0;
	scanf("%d", &a);
	printf("%d",F(a));
	return 0;
}

👀汉诺塔问题是什么

        1.有三根杆子A,B,C。A杆上有若干碟子
   2.每次移动一块碟子,小的只能叠在大的上面
   3.把所有碟子从A杆全部移到C杆

🏹如何思考汉诺塔问题

我们在思考汉诺塔问题的时候,也可以尝试用青蛙跳台的思路来思考,如果我只有一个碟子,我是不是直接把碟子从A移动到C上即可,那如果是两个呢,我这个时候是不是要借着B来移动即A->B   A->C ,  B->C,那么B就是我们的一个中转位置。而C就是我们的终点。是3个的时候就是  A->C    A->B    C->B    A->C    B->A    B->C    A->C,但如果接着往下相信还是不少人会头疼的,但我们这个时候坐下来想一下,好像无论是多少个,我们最后都得把最后那个大的最底下那个移到C上,那么我们把最底下那个从A移动到C的时候剩下的n-1不就会到了B的身上,那接着想现在Bn-1,是不是我们就要把B最底下那个移动到C上,然后再把身上的n-2个移动到A上,那经过不断地循环不就会到最后只剩下一个了。

🚅解决汉诺塔问题

了解了问题的解决思路我们就可以试着去写自己的代码了。

void move(char pos1, char pos2)
{
	printf("  %c->%c  ", pos1, pos2);//从pos1移动到pos2
}
void HanNuoTa(int n, char pos1, char pos2, char pos3)//n为多少个碟子,pos1起始位置,Pos2中转,pos3终止位置
{
	if (n == 1)
		move(pos1, pos3);
	else
	{
		HanNuoTa(n - 1, pos1, pos3, pos2);//将n-1个碟子从pos1经过pos3移到pos2
		move(pos1, pos3);//将pos1上的一个碟子移动到pos3
		HanNuoTa(n - 1, pos2, pos1, pos3);//将n-1碟子从pos2经过pos1移动到pos3
	}
}
int main()
{
	int a;
	scanf("%d", &a);
	HanNuoTa(a, 'A', 'B', 'C');//a为多少个棋
}

解析

最后这个代码呈现的结果可能出乎很多人的意料,因为它其实显示的只是一个思路,就是将A上的N-1个移动到B,然后将A最后的那个碟子移到A上,最后再将B的N-1个棋子移动到移动C上。但其实递归你要带进去想,比如:HanNuoTa(n - 1, pos1, pos3, pos2);//将n-1个碟子从pos1经过pos3移到pos2,它在实行的时候就要再次套入,在里面再将n-1个碟子再移动,将n-2个碟子移动到C上,再将最底下的移动到B上,再接着再套最后完成程序。

🌍结束语

好了,今天的分享就到这里了,其实大家在用递归写代码问题的时候可以试着去用自己的解题思路大胆去写,这样我们有时候就可能解决很多递归的难题了。

如果觉得文章对你有帮助的话,还请点赞,关注,收藏支持小赵,如有不足还请指点,小赵及时改正,感谢大家支持!!!

  • 48
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱编程的小赵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值