汉诺塔问题就是函数递归问题。
·当只有一个盘子时直接把盘子从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,2,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;
}