【C语言】汉诺塔

一. 什么是汉诺塔?

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具

大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。

大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

规定:在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

二. 分析

若只有1个圆盘时,从A柱移动到C柱,需要1步。2个圆盘时,则需要3步。3个圆盘时,则需要7步。

1.第1个圆盘从A-------->C

2.第2个圆盘从A-------->B

3.第1个圆盘从C-------->B

4.第3个圆盘从A-------->C

5.第1个圆盘从B-------->A

6.第2个圆盘从B-------->C

7.第1个圆盘从A-------->C

不难看出,当有n个圆盘时,汉诺塔步数的规律是2^n-1。那么当有64个圆盘时就需要2^64-1步。

通过分析我们可以将其分为三个步骤:
1.通过递归将A柱的n-1个圆盘从A柱移动到B柱(C为工具柱)

2.将A柱最后1个圆盘移动到C柱

3.此时B柱有n-1个圆盘,C柱有1个圆盘。递归将B柱上的圆盘移动到C(A为工具柱)

三. 代码实现

#include <stdio.h>
int step = 0;//步数
//移动一个圆盘
void Move(char a,char c,int n) {
	printf("把第%d个圆盘从%c ---> %c\n",n,a,c);
	step++;
}
void Hanoi(char a,char b,char c,int n) {
	if (n != 1) {
		Hanoi(a, c, b, n - 1);//1.当A有n个圆盘时将n-1个圆盘,借助C,移至到B
		Move(a, c, n);//2.将A剩余的最后1个圆盘移至C
		Hanoi(b, a, c, n - 1);//3.B剩余n-1个圆盘,借助A,移至C
	}
	else {
		Move(a, c, n);//若有1个圆盘,直接将圆盘从A移动到C(递归出口)
	}
}
void main() {
	int n = 0;
	printf("请输入汉诺塔的圆盘数:");
	scanf("%d",&n);
	Hanoi('a','b','c',n);
	printf("共走了%d步",step);
}

 运行结果:

 四. 总结

汉诺塔是经典的递归题,关键还是要理解递归思想,还有,只需要关心自己的任务,分派出去的任务只用关心它最后的结果,而执行过程则不要去过多地关注。


关于C语言实现汉诺塔的讲解到这里就结束了,如果有什么疑问的地方欢迎留在评论区,谢谢支持~

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

EurekaO-O

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

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

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

打赏作者

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

抵扣说明:

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

余额充值