理解汉诺塔递归算法

1. 概述

第一次遇见汉诺塔问题是在数据结构课本上,是一个很经典的递归算子。汉诺塔问题实际上就是要将柱子A上由小到大排列的圆环按照相同的大小顺序移动到柱子C,之间的过程可以使用柱子B。这个问题使用递归和归纳的思想来思考的话就很容易理解了。
下面这货就是汉诺塔了
理解汉诺塔递归算法_第1张图片
其递归的归纳思想是这样的:
(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. 结果

理解汉诺塔递归算法_第2张图片

你可能感兴趣的:([1],程序设计)