递归调用之汉诺塔问题

● 有三根针A、B、C。A针上有N个盘子,大的在下,小的在上,要求把这N个盘子从A针移到C针,在移动过程中可以借助B针,每次只允许移动一个盘,且在移动过程中在三根针上都保持大盘在下,小盘在上。

将n 个盘子从A针移到C针可以分解为三个步骤:

1  将A 上n-1个盘子移到 B针上(借助C针);

2  把A针上剩下的一个盘子移到C针上;

3  将n-1个盘子从B针移到C针上(借助A针)。

源代码如下:
#include<iostream>  
using namespace std;

//把src针最上面一个盘子移动到dest针上
void move(char src, char dest)
{
	cout << src << "-->" << dest << endl;
}
//把n个盘子从src针移到dest针,以medium针为媒介
int hanoi(int n, char src, char medium, char dest)
{
	static int count = 0;
	count++;
	if (n == 1)
		move(src, dest);
	else
	{
		hanoi(n - 1, src, dest, medium);
		move(src, dest);
		hanoi(n - 1, medium, src, dest);
	}
	return count;
}

int main(){
	int m;
	cout << "输入盘子数量:";
	cin >> m;
	cout << "移动" << m << "个盘子的步骤:" << endl;
	cout << "移动次数:" << hanoi(m, 'A', 'B', 'C')<<endl;
	system("pause");
	return 0;
}

运行结果如下:


### Python递归函数实现汉诺塔问题 汉诺塔是一个经典的递归问题,其核心在于理解递归的思想以及柱子角色的变化。以下是基于提供的参考资料和专业知识编写的解决方案。 #### 汉诺塔问题描述 汉诺塔的目标是从起始柱(`A`)将所有的盘子移动到目标柱(`C`),借助缓冲柱(`B`)。在此过程中需遵循以下规则: 1. 每次只能移动一个盘子。 2. 移动过程中大盘子不能压在小盘子上方。 --- #### 示例代码实现 下面是使用Python递归函数实现汉诺塔问题的代码: ```python def hanoi(n, source, auxiliary, target): """ 使用递归方法解决汉诺塔问题 参数: n (int): 需要移动的盘子数量 source (str): 起始柱名称 ('A') auxiliary (str): 缓冲柱名称 ('B') target (str): 目标柱名称 ('C') """ if n == 1: # 基础情况:当只有一个盘子时直接从source移到target print(f"Move disk 1 from {source} to {target}") return # 将前n-1个盘子从source移至auxiliary,利用target作为辅助 hanoi(n - 1, source, target, auxiliary) # 移动第n个盘子从source到target print(f"Move disk {n} from {source} to {target}") # 将剩余的n-1个盘子从auxiliary移至target,利用source作为辅助 hanoi(n - 1, auxiliary, source, target) # 测试代码 if __name__ == "__main__": num_disks = 3 # 设定盘子的数量 hanoi(num_disks, 'A', 'B', 'C') # 执行汉诺塔算法 ``` --- #### 运行过程解析 对于 `num_disks = 3` 的情况,上述程序会按照如下顺序完成操作[^5]: 1. **第一次递归调用** (`hanoi(2, A, C, B)`): - 将顶部两个盘子从 `A` 移动到 `B`,借助 `C` 作为中间过渡。 2. **打印当前动作**: - 输出 `"Move disk 3 from A to C"` 表示最大的盘子被直接从 `A` 移动到了 `C`。 3. **第二次递归调用** (`hanoi(2, B, A, C)`): - 将之前存放在 `B` 上的两个盘子移动到 `C`,借助 `A` 作为中间过渡。 具体输出结果为: ``` Move disk 1 from A to C Move disk 2 from A to B Move disk 1 from C to B Move disk 3 from A to C Move disk 1 from B to A Move disk 2 from B to C Move disk 1 from A to C ``` --- #### 关键点说明 1. **递归终止条件**: 当只剩下一个盘子时,直接将其从源柱移动到目标柱[^2]。 2. **柱子角色变化**: 在每次递归调用中,三个柱子的角色会发生动态调整。例如,在处理较小规模的问题时,原本的目标柱可能变为新的缓冲柱[^4]。 3. **分治法思想**: 整体问题被分解成更小的子问题,直到达到最简单的情况(即只有一层盘子)[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值