有关汉诺塔的算法问题——C++递归

汉诺塔问题发源于古老的梵天寺之塔仪式,传说当世界诞生的时候,有一座摞了64个黄金碟子的钻石塔(记为A塔)。碟子按从大到小的次序自底向上地摞在塔上。除此之外还有两个钻石塔(记为B和C塔),从世界诞生之日开始,梵天寺的僧侣们就通过塔C将碟子从A塔搬到B塔,但每次只能搬一个碟子,并且任何时候都不能大的碟子在上小碟子在下。根据传说,当僧侣完成任务是就是世界毁灭之时。

这个问题可以用递归来解决。假设碟子数是n个,为了将最大的第n个从A搬到B,需要先将剩下的n-1个碟子搬到C上,我们需要解决的问题就是如何将塔C上的碟子搬到塔B上。此时我们可以用塔A和B,可以先不管B上已有的碟子,因为它是最大的,其他碟子都可以放在它上面。这时就可以用递归算法。改程序首次调用是TowersOfHanio(n,A,B,C).即将一个搬运n个碟子的问题转换为两个搬动n-1个碟子的问题。

#include<iostream>
enum tower{A = 'A',B = 'B',C = 'C'};
void TowersOfHanoi(int n,tower X,tower y,tower z)//从塔x的顶部移动n个碟子到塔y 
{
	if(n)
	{
		TowersOfHanio(n-1,x,z,y);
		cout<<"move top disk from tower"<<char(x)<<"to top of tower"<<char(y)<<endl;
		TowersOfHanio(n-1,z,y,x);
	} 
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值