汉诺塔问题:
对于递归问题,很多时候我们可以先认为我们的我们写的这个递归函数在有了出口的情况下是可以实现的我们要解决的问题。
对于这个汉诺塔问题,因为他是要把64个盘子从a移动到c,所以我们可以先认为我们把上面63个盘子从a移动到了b,至于怎么实现的,我们不用管,可以认为我们写的这个函数是可以完成的(就是上面那段话的思想),把63个盘子从a移动到了b之后,再把64号盘子从a移动到了c,然后再把b的63个盘子移动到了c,大致思想就是这样的。
所以对于一般情况,移动n个盘子,可以认为是先将前n-1个盘子移动到b柱,再把第n号盘子移动到c柱,然后再把b柱上的n-1个盘子移动到c柱
函数代码:
#include<iostream>
using namespace std;
int move(int n,char a,char b,char c)
{
if(n==1)
{
cout<<a<<"->"<<c <<endl;
//函数出口
return 0;
}
else
{
move(n-1,a,c,b);
//先完成n-1片从a到b
cout<<a<<"->"<<c <<endl;
// a的最后一片到c
move(n-1,b,a,c);
//移动n-1片从b到c
}
return 0;
}
int main()
{
int n;
cout<<"请输入盘子的数目n:";
cin>>n;
move(n,'A','B','C');
return 0;
}