【小白系列】用C语言解决汉诺塔问题

目录

1.前言

 2. 思路分析

3. 代码实现

4. 结语


1.前言

有朋友说要我写一个解决汉诺塔问题的码,应邀而来,浅试一下水。问题比较经典,先上百度百科

 当只有3个盘子时

 2. 思路分析

 那我们其实可以由简入繁。

当只有1个盘的时候,只用移动1次;

有2个盘的时候,需要移动3次;

有3个盘的时候,需要移动7次;

只要最大的盘在底下,那么这个最大的盘就可以忽略!!

那也就是说3个盘,我可以先把除最大外的所有盘弄到一堆,然后再移动最大盘到最右边,然后再将那一堆盘移回最右边。我们可以发现这个过程其实是有规律性的。

将n个盘替换掉上面的3个盘,是不是也同样是这个意思呢?!!

我们在移动3个盘的时候,除开移动最大盘的那一步,其实我们是在做移动2个盘的工作;

我们在移动2个盘的时候,除开移动最大盘的那一步,其实我们是在做移动1个盘的工作!!

那这时候高中数列就上场了

设移动n个盘子需要移动a_{n}次,那把除了最大盘外的所有盘移出去是不是就需要移动a_{n-1}次呢,移动最大盘需要1次,把除了最大盘外的所有盘移回来是不是也需要移动a_{n-1}次呢?

可以得到公式:a_{n}=2*a_{n-1}+1

 我们知道 a_{1}=1,那么这样,问题是不是就能解决了呢?答案是正确的!!其实就是看问题的转化能力!!

3. 代码实现

由于2的思路已经分析的很彻底了,所以我不多讲,直接选择递归来计算。

//汉诺塔问题
int cpt(int n)
{
	if (n == 1)
		return 1;
	if (n != 1)
		return 2 * cpt(n - 1) + 1;
}
int main()
{
	int n = 0;
	printf("把n个盘子移动到最右边,请输入n的值:");
	scanf("%d", &n);
    //cpt函数用来计算次数,结果存在sum中
	int sum = cpt(n);
	printf("共需移动%d次",sum);
	return 0;
}

4. 结语

 这就是汉诺塔问题思路分析及其C语言实现方法,如果大家有什么想看的文章可以评论在下方,只要博主有能力做的一定用心写出好的文章!!最后还是求大家3连一波,关注我,一起进步吧!!

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Laxinues

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

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

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

打赏作者

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

抵扣说明:

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

余额充值