汉诺塔问题(递归实现)

【算法描述】如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘经过A,B,C三根柱子的过渡,最终移到C柱子上去
有两个原则:

  1. 一次只能移动一个圆盘
  2. 小圆盘必须在大圆盘上面
    在这里插入图片描述

【分析】这道题是用递归的算法做,基本思想就参考“李永乐老师讲汉诺塔”这个视频吧,算是讲得很清楚了,看一遍一般都能懂。

知道基本思想之后,我们来看怎么用计算机来将其实现。

在视频中我们有这么一个过程(以5个圆盘为例),就是把A柱上的上面4个圆盘用某种方法移动到B柱。递归算法有个特点,就是在递归到某一层的时候,只需要在本层范围做好我该做的那些大体操作就好了,不需要知道某些细节,这些细节丢给下面的层去递归地实现就好了。这里也同样,我们只需要知道我要把4个圆盘移动到B柱,具体怎么移动只需要丢一个递归下去让小弟实现就行了。丢完之后,我们就把A柱上剩地那个圆盘移动到C柱,然后再把B柱上的4地圆盘挪到C柱上。这次挪4个圆盘到C柱,我们同样不需要知道具体操作,直接丢给下面的小弟层帮我们递归好就行。

那么,总结起来,就三个步骤:
  • 把4个圆盘从A柱移动到B柱,这里丢给下面的递归函数去实现
  • 把1个圆盘从A柱移动到C柱,这里可以直接移动
  • 把4个圆盘从B柱移动到C柱,这里同样丢给下面的递归函数去实现
那么现在就只有一个问题,怎么丢给下面的递归函数呢?

在这里我们给A,B,C三个柱子各起一个名字,分别为起始柱,过渡柱,结束柱(如图)。
当我们要把5个圆盘全部从A柱移动到C柱的时候,A为起始柱,B为过渡柱,C为结束柱。
在这里插入图片描述
在这里插入图片描述
在进行第一个步骤的时候,我们要把4个圆盘从A移动到B,这时候,对于这4个圆盘来说,A为起始柱,B变为结束柱,C变为过渡柱。
在这里插入图片描述
在这里插入图片描述
第三个步骤以此类推。
也就是说,我们在进行一,三步骤的时候,只需要告诉下层函数起始柱,结束柱,过渡柱分别是哪一根(三个char变量),并且起始柱上需要进行移动的圆盘数量(一个int变量)就行了。然后下层函数就会自己从他认为的起始柱上,移动相应数量的圆盘到结束柱上。


int hanoi(int num,char start,char transition,char end)
{
	if (num > 0)
	{
		hanoi(num - 1, start, end, transition);//B换到结束柱的位置,C换到过渡柱的位置
		printf("%c -> %c\n", start, end);
		hanoi(num - 1, transition, start, end);
	}
}

void main()
{
	int num;
	scanf_s("%d", &num);
	hanoi(num, 'A', 'B', 'C');
}
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值