汉诺塔问题

汉诺塔问题就是函数递归问题。

·当只有一个盘子时直接把盘子从A移动到C

·当有两个盘子时(从上往下数标为1,2),先把1移动到B,再将2移动到C,然后将1移动到C

·当有三个盘子时,这时候就比较麻烦了,但是这时候也是恰恰能够稍微清晰体现函数递归的规律来了。关键的是我们要把3号盘子放在C的最底下,这是我们可以假想把1,2当做一个整体a,把3当做另外一个b,还是按照上一步只有两个盘子的操作执行,这样我们就可以完成整个操作。我们假想把1,2当做一个整体的过程就是递归,其中1,2号盘子又是按照第二情况操作执行的。所以思路就是先把1,2号盘子按照从小到大顺序排好,(把这时的B当做第二种情况的C),然后把3号盘子放到C,再将1,2号盘子按照第二种情况移动到C(这时把1,2号所在的B当做第二种情况的A,C还是目标C);

·当有四个盘子时类似上面操作执行。先把1,2,3号按照顺序移动到B,再把4号移动到C,再把B上的1,,3移动到C

......

代码如下

#include<iostream>
using namespace std;
int hannuota(int,char,char,char);
int move(char,char);
int main()
{
	int m;
	cout<<"请输入盘子数量:"<<endl;
	cin>>m;
	cout<<"移动方式是:"<<endl;
	hannuota(m,'A','B','C');
}
int hannuota(int n,char one,char two,char three)
{
	if(n==1)
		move(one,three);
		else
		{
			hannuota(n-1,one,three,two);//将n-1个盘子先移动到所谓的B
			move(one,three);//将n移动到所谓的C
			hannuota(n-1,two,one,three);//再将n-1个在B待着的盘子移动到所谓的C
		}
}
int move(char getone,char putone)
{
	cout<<getone<<"-->"<<putone<<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值