利用递归方法解决汉诺塔问题

利用递归方法解决汉诺塔(Hanoi)问题

一、汉诺塔问题
图片来源于网络
汉诺塔问题是一个经典的古典数学问题,它由三根柱子和若干个圆盘组成。
游戏规则如下:
1.每次只能移动一个圆盘
2.任何时候必须保证大圆盘在下,小圆盘在上
3.目的是在1,2条件下将一根柱子上所有圆盘转移到另一根柱子上。
二、递归算法
想要利用递归解决这个问题,首先我们要确定几个概念:
1、初始柱A 也就是游戏开始时所有圆盘所在的柱子。
2、中间辅助柱B 在转移过程中需要用到的辅助柱。
3、目标柱C 转移的最终目标柱。

首先我们来看当圆盘只有两个时应该如何移动。

我们只需要将A柱的上面一个圆盘暂时放在B柱上,然后将A柱下面一个圆盘直接放在目标柱C上,最后再把B柱暂时存放的圆盘放到C柱上。

然后我们以三个圆盘为例,确定另外一个概念:整体

在移动三个圆盘时,我们不妨假设上面两个圆盘为一个整体,把它看作为一个圆盘。那么解决问题的方法与只移动两个圆盘类似。

而在移动这个整体圆盘时,我们也需要用到与最开始只移动两个圆盘同样的方法,不同的只是目标柱。

不难联想,当圆盘个数变为n时,我们只需要多进行几次与上面同样的步骤,即可获得解决汉诺塔问题的方法。

接下来我们来看,如何在C语言中实现这个算法

三、利用C语言实现算法
递归函数:

void hanoi(int N,char a,char b,char c) 
/*a,b,c分别代表初始柱,中间柱,目标柱    N代表圆盘总数*/
{
	if(N==1) //递归算法的出口
		printf("%c -> %c\n",a,c);//将A移动至C

	else{
	hanoi(N-1,a,c,b); //将整体圆盘从A移动到目标柱(此时目标柱是B)
	printf("%c -> %c\n",a,c);//然后将A剩余的一个圆盘直接移动到C
	hanoi(N-1,b,a,c);//再将整体圆盘从B借助辅助柱A移动到C

	}

}

四、总结
递归方法可以解决很多问题,但是频繁调用函数会占用计算机比较多的资源从而降低效率,所以在使用时应谨慎。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值