理解汉诺塔递归算法

1. 概述

第一次遇见汉诺塔问题是在数据结构课本上,是一个很经典的递归算子。汉诺塔问题实际上就是要将柱子A上由小到大排列的圆环按照相同的大小顺序移动到柱子C,之间的过程可以使用柱子B。这个问题使用递归和归纳的思想来思考的话就很容易理解了。
下面这货就是汉诺塔了

其递归的归纳思想是这样的:
(1)首先,当只有一个盘子的时候只需要将A上的1号盘子移动到C上就行了
(2)当有2个盘子在A上的时候,需要将A上的1号盘子(由上往下数)移动到B上,再将A上的2号盘子移动到C上,之后将B上的1号盘子移动到C上
(3)当有3个盘子在A上的时候,需要将A上的1号和2号盘子移动到B上(需要借助C),之后将A上的3号盘子移动到C上,再将B上的盘子移动到C上(需要借助A)
(...)以此类推
(N)当有N个盘子在A上的时候,需要将A上的N-1个盘子移动到B上(需要借助C),之后将A上的第N个盘子移动到C上,再将B上的盘子移动到C上(需要借助A)

2. 实现

CHanoi::CHanoi()
{
	this->m_stepCount = 0;			//设置步数为0
}

//************************************************************************
// 函数名称:    	CHanoi
// 访问权限:    	public 
// 创建日期:		2016/12/27
// 创 建 人:		
// 函数说明:		汉诺塔类构造函数
// 函数参数: 	unsigned int plate_num	定义圆盘的个数
// 返 回 值:   	
//************************************************************************
CHanoi::CHanoi(unsigned int plate_num)
{
	this->m_plateNum = plate_num;	//设置圆盘的个数
	this->m_stepCount = 0;			//设置步数为0
}


CHanoi::~CHanoi()
{
}


//************************************************************************
// 函数名称:    	Hanoi_Move
// 访问权限:    	public 
// 创建日期:		2016/12/27
// 创 建 人:		NPC
// 函数说明:		递归汉诺塔算法
// 函数参数: 	unsigned int plate_num	放置的盘子的数目
// 函数参数: 	std::string from		盘子的初始放置位置
// 函数参数: 	std::string depend		盘子移动需要借助的位置
// 函数参数: 	std::string to			盘子移动的目标位置
// 返 回 值:   	void
//************************************************************************
void CHanoi::Hanoi_Move(unsigned int plate_num, std::string from, std::string depend, std::string to)
{
	if (1 == plate_num)
	{
		cout << "第 " << ++this->m_stepCount << " 步: " << "将盘子" << plate_num << "由 " << from << " 移动到 " << to << endl;
		return;
	}
	else
	{
		this->Hanoi_Move(plate_num-1, from, to, depend);
		cout << "第 " << ++this->m_stepCount << " 步: " << "将盘子" << plate_num << "由 " << from << " 移动到 " << to << endl;
		this->Hanoi_Move(plate_num-1, depend, from, to);
	}
}

class CHanoi
{
public:
	CHanoi();
	CHanoi(unsigned int plate_num);
	~CHanoi();

private:
	unsigned int m_plateNum;
	unsigned int m_stepCount;

public:
	void Hanoi_Move(unsigned int plate_num, std::string from, std::string depend, std::string to);	//递归汉诺塔算法
};

调用:
	CHanoi* p = new CHanoi();
	p->Hanoi_Move(3, "A", "B", "C");

3. 结果


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值