汉诺塔问题-递归实现

1.汉诺塔问题描述      

  有a、b、c三个底座,底座上面可以放盘子。初始时a座上有n个盘子,这些盘子大小各不相同,大盘子在下,小盘子在上,依次排列。要求将a座上n个盘子移至c座上,每次只能移动一个,并要求移动过程中保持小盘子在上,大盘子在下,可借助b座实现移动。编程输出移动步骤。

 

 2.汉诺塔问题分析  

   这个问题可用递归思想来分析,将n个盘子由a座移动到c座可分为如下三个过程:

                          先将a座上n-1个盘子借助c座移至b座;

                          再将a座上最下面一个盘子移至c座;

                          最后将b上n-1个盘子借助a移至c座。  

     上述过程是把移动n个盘子的问题转化为移动n-1个盘子的问题,按这种思路,再将移动n-1个盘子的问题转化为移动n-2个盘子的问题,……直至移动一个盘子。可以用两个函数来描述上述移动过程: 从一个底座上移动n个盘子到另一底座。 从一个底座上移动1个盘子到另一底座。

3.代码实现

void Move(char a, char b) {
	printf("%c->%c\n", a, b);
}
void Hanoi(char a, char b, char c, int n) {//a代表被移动元素的柱子,
	                                       //b代表被借用来移动元素的柱子,c代表将元素移动到的柱子
	if (n == 1) {
		 Move(a, c);
	}
	if (n >= 2) {
	     Hanoi(a, c, b, n - 1);//将A柱上面n-1个盘借助c移动到B
		 Move(a,c);//将A柱剩下的最下面那个盘移动到c
		 Hanoi(b, a, c, n - 1);//将B柱上n-1个盘借助a移动到c
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值