递归-汉诺塔游戏

本文介绍了汉诺塔游戏的基本规则,通过图解展示盘子移动的规律,并详细讲解了利用递归思想实现Hanoi函数的代码,包括模拟移动和完整代码示例。
摘要由CSDN通过智能技术生成

目录

1.汉诺塔游戏的规则

2.汉诺塔游戏的图解

3.实现汉诺塔的思路

4.代码呈现

   4.1 模拟移动的代码

   4.2 Hanoi的递归代码

   4.3 完整代码

5.运行结果

1.汉诺塔游戏的规则

汉诺塔的内容:将A柱上的n个盘子,通过B柱全部转移到C柱上

规则:1.小盘子必须在大盘子上。

           2.每次只能移动一个盘子。

2.汉诺塔游戏的图解

盘子数步数规律
112^1-1
232^2-1
372^3-1
n2^n-12^n-1

以3个盘子为例,图示如下:

看到这里我们就能发现,从三个盘子开始,想要完成游戏要求的步骤会越来越多,越来越繁琐,那我们不妨思考一下如何将这个问题简化。

3.实现汉诺塔的思路

我们思考一下,可以发现,将这些盘子设为n,底下最大的盘子为1,则其他盘子为n-1。

这些n-1个盘子都需要经过将他们整体移动到B柱上,然后再将最大的盘子移动到C柱上,最后将n-1个盘子移动到C柱上。

因此,我们就可以将这一个复杂的大问题转化为与原问题相似,但是规模较小的问题(递归思想)

4.代码呈现 

4.1模拟移动的代码

void move(char x, char y)//用move函数来移动
{
	printf("%c->%c\n", x, y);

}

4.2Hanoi的递归代码

void Hanoi(int n, char a, char b, char c)//a为原桩,b为协助桩,c为目标桩
{
	if (n == 1)//如果只有一个盘子则通过a移动到c
	{
		move(a, c);
}
	else
	{ 
		Hanoi(n - 1,a ,c, b);//先将n-1个盘子通过C移动到B
	    move(a,c);//把最大的盘子从A移动到C
	   Hanoi(n - 1,b , a, c);//最后将n-1个盘子从B移动到C
	}

}

4.3完整代码

#define  _CRT_SECURE_NO_WARNINGS  1
#include <stdio.h>
void move(char x, char y)//用move函数来移动
{
	printf("%c->%c\n", x, y);

}
void Hanoi(int n, char a, char b, char c)//a为原桩,b为协助桩,c为目标桩
{
	if (n == 1)//如果只有一个盘子则通过a移动到c
	{
		move(a, c);
}
	else
	{ 
		Hanoi(n - 1,a ,c, b);//先将n-1个盘子通过C移动到B
	    move(a,c);//把最大的盘子从A移动到C
	   Hanoi(n - 1,b , a, c);//最后将n-1个盘子从B移动到C
	}

}
int main()
{
	int n;
	printf("请输入你的盘子数量:");
	scanf("%d", &n);
	Hanoi(n, 'A', 'B', 'C');

	return 0;
}

5.运行结果

 如果这篇文章有什么不足,欢迎大家在评论底下留言。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值