递归思想——汉洛塔问题(c语言)

问题描述

简单来说,汉罗塔问题就是把A柱上的方块全部移到C柱上,每次只能移动一个盘子并且移动的过程中大的方块始终在小的方块下面。 当有n个盘子时,该如何移动?。

算法思想

这个题为什么会采用了递归的思想呢?递归的核心在于将大问题分解为若干个小问题直到达到某种可以直接解决的简单情况。那么是否可以把汉罗塔问题拆解成一个直接解决的小问题?答案是当然可以。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
3号从A杆移动到C杆的过程中,A杆为起始杆,C杆是目标杆,在此之前,B杆要先暂时存放2号,才能保证3号移动到C杆,所以B杆为辅助杆
在这里插入图片描述
以此类推:
当移动四个方块时,从上到下(小的方块在上面)编号为别为1、2、3、4,前三个方块看出整体。则移动过程为:
1、2、3—>B,4—>C,1、2、3—>C 。
当移动五个方块时,(从上到下小的方块在上面)编号为别为1、2、3、4、5,前四个方块看出整体。则移动过程为:
1、2、3、4—>B,5—>C,1、2、3、4—>C 。
移动n个时把前n个看成整体:
前n个方块—>B,第n个方块—>C,1前n个方块—>C 。
综上所述,移动n个方块可以分解成移动前n-1个方块和移动第n个方块,前n-1个方块的移动也能分解成更小的情况。把复杂的问题简单化就是递归的思想

代码解析

#include<stdio.h>
void move(int n,char start, char goal)
{
	printf("移动%d号方块:%c—>%c ", n,start, goal);
	printf("\n");
}
void hanoi(int n, char start, char assist, char goal)
{
	if (n == 1)
		move(n,start, goal);
	/*递归的出口,只移动一个方块时,直接一步从起始杆到目标杆。
	打印路程即可*/
	else
	{
		hanoi(n - 1, start, goal, assist);
		//移动多个方块时,按照上面的规律,第一步:移动前n个
		move(n,start, goal);
		//第二步:移动直接移动第n个到目标杆
		hanoi(n - 1, assist, start, goal);
		//第三步:移动辅助杆上的前n个到目标杆上
	}
}
int main()
{
	int n;//要移动方块的个数
	scanf("%d", &n);
	hanoi(n, 'A', 'B', 'C');
	//初始化:起始杆为A杆,辅助杆为B杆,目标杆为C杆
	return 0;
}

在这里插入图片描述

运行结果

在这里插入图片描述
如果不是很理解建议画个图好好专研,一定会有所收获。很感谢您能有耐心的阅读完这篇文章。

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值