栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言】汉诺塔问题——递归

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言】汉诺塔问题——递归

目录

前言

一、求解思路

二、代码实现

1.参考代码

2.运行结果

总结


前言

​ 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。  


 

一、求解思路

三根柱子从左到右依次为 A , B , C,要将A的圆盘全部挪到C上去。

我们设盘子的数量为n,圆盘从小到大用数字表示,从1开始:

当 n = 1 时,移动1:A → C。

当 n = 2 时,移动1:A → B,移动2:A → C,移动1:B → C。

当 n = 3 时,移动1:A → C,移动2:A → B,移动1:C → B,移动3:A → C,移动1:B → A,

                     移动2:B → C,移动1:A → C。

汉诺塔问题中,n 个圆盘至少需要 2 ^n - 1 次移动操作。

通过上述过程总结出,对于初始状态下起始柱包含 2 个以上圆盘的情况,移动过程可以遵循以下步骤:

1.将起始柱上的 n-1 个圆盘移动到辅助柱B;

2.将起始柱上最大的圆盘移动到目标柱C;

3.将辅助柱中的 n-1个圆盘移动到目标柱C。

得出了以上的算法,我们就可以通过C语言来编写出程序了。


二、代码实现

1.参考代码
#include 

void Hanoi(int n,char pillar1,char pillar2,char pillar3) //1为起始柱,2为辅助柱,3为目标柱
{
	if (1 == n)
	{
		printf("移动第%d个:%c→%cn", n, pillar1, pillar3);
	}
	else if (n > 1)
	{
		Hanoi(n - 1, pillar1, pillar3, pillar2);
		printf("移动第%d个:%c→%cn", n, pillar1, pillar3);
		Hanoi(n - 1, pillar2, pillar1, pillar3);
	}
	else
	{
		printf("输入错误,重新选择n");
		main();
	}
}

int main()
{
	int n = 0;
	printf("要来多少个圆盘?n");
	scanf("%d", &n);
	Hanoi(n, 'A', 'B', 'C');
	return 0;
}

2.运行结果

 

当圆盘过多时,运行时间为以年为单位,如64个圆盘时运行结果等两百多年后再来看看差不多!


总结

汉诺塔是一个经典的问题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/456753.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号