递归算法——汉诺塔问题


题目

菱形塔(假设为A)上有64个金圆盘,尺寸依次减小。圆盘按照尺寸从大到小的顺序自底向上排列。除了A塔外,还有另外的B塔和C塔。现在利用C塔作为中间存放容器,将A塔上面的圆盘移动到B塔上。每次只能移动一个,且不允许将圆盘放置在尺寸比它更小的圆盘之上。


分析

此问题可以通过递归予以解释。假设A上的圆盘数为n,要将A上最大的圆盘置于B的底部,首先需要将n-1个圆盘置于C塔上,然后将最大的圆盘移动到B。剩下的任务即是将C塔上面的n-1个圆盘移动到B塔上。因为现在B塔底部的圆盘大于所有C塔上的圆盘,故可以忽略不计。于是形成一个递归问题。

设函数Hanoi(int n,char A,char B,char C)

其中n为初始A塔上的圆盘数。Hanoi函数的目的是将这n个圆盘从A移动到B。


程序

#include "iostream"

using namespace std;
void Hanoi(int n, char A, char B, char C)
{
	if (n > 0)
	{
		Hanoi(n - 1, A, C, B);//先将n-1个圆盘从A移动到C
		cout << "move top disk from tower " << A << " to top of tower " << B << endl;//将A底部最大的圆盘从A移动到B
		Hanoi(n - 1, C, B, A);//最后将C上的n-1个圆盘移动到B
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值