【数据结构与算法】递归汉诺塔

本文探讨了使用递归方法解决汉诺塔问题,详细解析了如何通过递归算法将所有盘子从一根柱子移动到另一根柱子上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

汉诺塔


汉诺塔是根据一个传说形成的数学问题( 关于汉诺塔):
有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:
每次只能移动一个圆盘;
大盘不能叠在小盘上面。
提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。

递归汉诺塔


解题思路:
可以把问题简化成2个盘子的情况,如:A上有两个盘子,B和C是空的。如果要把A的两个盘子全部移动到C,需要经过以下步骤:
1.A移动一个盘子到B

2.A移动一个盘子到C

3.B移动一个盘子到C

到这里已经把所有盘子移动到C盘,其实可以把底盘上面的盘子看成一个整体,这就简化成3步了,然后使用递归重复这3个步骤就完成了所有盘子的位移。

使用递归解汉诺塔,并实时打印每一步的变化和计算步数。
#include 
   
    
#include 
    
     

std::string ga ("987654321");
std::string gb ("");
std::string gc ("");
// 步数(最少移动2^n - 1次才能完成。)
static int step = 0;

FILE* file = NULL;

// count是盘子的数量
void han(int count, std::string &a, std::string &b, std::string &c){

	if (count < 1)
	{
		return;
	}

	// A --> B
	han(count-1, a, c, b);

	//递归的一个特点:每一个步骤都依赖上一个步骤的结果。
	// A --> C
	c.append(1,*(a.end()-1));
	a.erase(a.end()-1);	

	// 计数
	++step;
	// 实时打印a、b、c的变化
	std::cout<<"a = "<
     
      <
      
     
    
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值