递归方法是通过利用系统上一阶段的状态来计算本阶段的状态,类似于“数学归纳法”,由初始阶段状态与状态间的变换函数可得任意阶段的系统输出。
汉诺塔某一层的移动是先进先出,因此可以利用链栈和递归方法来构建并实现汉诺塔问题:
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
//建立链栈的一个节点
typedef struct node
{
int data;
struct node *link;
}*stackLink;
int height;//塔高
stackLink topA,topB,topC;//三个链栈的顶节点
//向链栈中增加一个节点
void pushLink(stackLink &topA,int data)
{
stackLink p;
p=new node;
p->data=data;
p->link=topA;
topA=p;
}
//链栈中弹出顶点
int popLink(stackLink &topA)
{
int data;
stackLink p;
p=topA;
data=p->data;
topA=p->link;
free(p);
return data;
}
void makeHanoi(int height,stackLink &topA,stackLink &topB,stackLink &topC)
{
topA=NULL;
topB=NULL;
topC=NULL;
//向A塔中加入数据,大数在下
for(int i=height;i>0;--i)
{
pushLink(topA,i);
}
}
//将一块积木移动到另一个塔上
void moveOnce(stackLink &topA,stackLink &topC)
{
int data;
if(topA!=NULL)
{
data=popLink(topA);
pushLink(topC,data);
}
}
//移动汉诺塔,其中多次调用函数自身
void moveHanoi(int height,stackLink &topA,stackLink &topB,stackLink &topC)
{
stackLink p,q,r;
p=topA;
q=topB;
r=topC;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->link;
}
while(q!=NULL)
{
cout<<q->data<<" ";
q=q->link;
}
while(r!=NULL)
{
cout<<r->data<<" ";
r=r->link;
}
if(1==height)
{
moveOnce(topA,topC);
}
else
{
moveHanoi(height-1,topA,topC,topB);
moveOnce(topA,topC);
moveHanoi(height-1,topB,topA,topC);
}
}
int main()
{
cout<<"input height of Hanoi:"<<endl;
cin>>height;
makeHanoi(height,topA,topB,topC);
moveHanoi(height,topA,topB,topC);
return 0;
}
这样便实现了汉诺塔算法,当然数据结构上可以采取更简单的例如字符串,但多尝试几种可以变得融会贯通哈~