汉诺塔问题(递归思想详谈)

文章通过作者自身的学习经历解释了如何利用递归思想解决汉诺塔问题,通过与二叉树递归问题的类比,如计算节点数和最大深度,帮助理解汉诺塔的解法。核心在于递归过程中起始柱、目标柱和中转柱的角色变换。
摘要由CSDN通过智能技术生成

  汉诺塔是非常有意思的递归问题,我第一次接触还不理解,把问题拖延到半年后至今才理解,因为我最近学到数据结构里的二叉树,二叉树有非常多的例题是用递归实现的,例如求二叉树节点数,求最大深度,当我理解了一个又一个二叉树递归题,我突然觉得汉诺塔问题应该不难了,于是我把递归图大致画出来,然后我就对汉诺塔理解的七七八八了,貌似接来下就细说我是如何理解的汉诺塔问题。

汉诺塔的问题就是把这n个盘子从起始处移动到终点柱,由题得,盘子在任意柱上都应该是大盘子在下,小盘子在上,所以n个盘子要想到终点柱那第n个盘子就要先到终点柱,那盘子中n-1个就要移开,第n个盘子才能移动到终点柱,

此时起始柱无盘子,n-1个盘子在中转柱上第n个已经直接移动到目标柱子上,接下来我们就是把中转柱的n-1个盘子移动到终点柱,第n-1个盘子还是要先到目标柱,所以要把n-2个盘子移动到起始柱放着,再把第n-1个盘子移动到目标柱,注意:此时对于这n-1个盘子来说,起始柱变为了B柱,中转柱是A柱,但目标柱还是C柱。(该递归问题中最需要注意的就是起始柱,目标柱和中转柱是不停交换的)

#include<stdio.h>
void Move(char start, char terminal, int n)
{
	printf("把第%d个盘子从%c移动到%c\n", n, start, terminal);
}
void Hanoi(char start, char transfer, char terminal, int n)
{
	if (n == 1)//当只剩一个盘子时,直接移动即可
	{
		Move(start, terminal, n);
		return;
	}
	//第一步,将n-1个盘子移动到中转柱,此时对于这n-1个盘子来说,
	//移动这n-1个盘子,起始柱是不变的,但目标柱和中转柱要交换
    因为对于不同时期移动盘子目标柱是不一样的
	 Hanoi( start, terminal, transfer, n-1);
	 //第二步把第n个盘子移动到目标柱
	 Move(start, terminal,n);
	 //第三步,把已经移动到中转柱B的n-1个盘子移动到目标柱,
    此时调用Hanoi函数起始处变为transfer
	 Hanoi(transfer,start,terminal, n - 1);
}
int main()
{
	//汉诺塔问题
	char start = 'A';
	char transfer = 'B';
	char terminal = 'C';
	int n = 0;
	scanf("%d", &n);//输入起始点要移动的盘子数
	Hanoi(start, transfer, terminal,n);//起始处n个盘子借助中转处将盘子移动到目标柱
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小何只露尖尖角

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

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

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

打赏作者

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

抵扣说明:

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

余额充值