由于函数递归过程是先进后出的(FILO),所以我们可以创建一个栈来模拟汉诺塔的非递归实现。
递归实现:
1、递归实现代码
#include <stdio.h>
#define TOWER 3 //为移动的层数定义一个TOWER常量
static int num=1; //定义一个静态变量作为移动次数
void move(char A,char C)
{
printf("第%d次:\t\t%c----->%c\n",num,A,C); //打印移动过程
num++;
}
void hannio(int n,char A,char B,char C) //递归实现移动过程
{
if(n==1)move(A,C); //退出出条件
else
{
hannio(n-1,A,C,B);
move(A,C);
hannio(n-1,B,A,C);
}
}
int main()
{
hannio(TOWER,'A','B','C');
printf("按任意键继续……");
getchar();
return 0;
}
- 用栈模拟递归过程--非递归实现过程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define SIZE 200 //初始化数据项大小
static int flag = 1; //记录移动次数
typedef struct //函数参数结构体作为栈的数据项
{
int n;
char A;
char B;
char C;
}HannioPara;
typedef HannioPara ElemList;
typedef struct astack //栈定义
{
int top;
int maxtop;
ElemList *data;
}Astack,*Stack;
Stack StackInit(int size) //初始化
{
Stack S = (Stack)malloc(sizeof *S);
S->data = (ElemList *)malloc(size*sizeof(ElemList));
S->maxtop = size;
S->top = -1;
return S;
}
int EmptyStack(Stack S) //栈空?
{
return S->top<0;
}
int FullStack(Stack S) //栈满
{
return S->top >= S->maxtop;
}
ElemList StackTop(Stack S) //栈顶元素
{
//if(EmptyStack(S)) return 0;
return S->data[S->top];
}
int Push(Stack S,ElemList i) //压栈
{
if(FullStack(S))return 0;
S->data[++S->top]=i;
return 1;
}
ElemList Pop(Stack S) //出栈
{
//if(EmptyStack(S))return 0;
return S->data[--S->top];
}
void StackShow(Stack S) //打印
{
while (!(EmptyStack(S)))
{
printf("%d%c%c%C\n", S->data[S->top--].n,S->data[S->top--].A,S->data[S->top--].B,S->data[S->top--].C);
}
}
void move(char a,char c) //打印移动过程
{
printf("第%4d次\t\t%c----->%c\n",flag,a,c);
flag++;
}
int hannio(int n,char a,char b,char c) //模拟递归实现
{
Stack S = StackInit(200);
ElemList tem,tem1,tem2;
tem.n = n;
tem.A = a;
tem.B = b;
tem.C = c;
Push(S,tem);//最外层函数最先入栈
while(S->top > -1) //栈不为空,出栈
{
tem1 = StackTop(S);//栈顶元素
Pop(S); //出栈
if (tem1.n > 1)
{
int n = tem1.n;
tem2.n = n-1;
tem2.A = tem1.B;
tem2.B = tem1.A;
tem2.C = tem1.C;
Push(S,tem2);//b,a,c 压栈
tem2.n = 1;
tem2.A = tem1.A;
tem2.C = tem1.C;
Push(S,tem2);//a.,c 压栈
tem2.n = n-1;
tem2.A = tem1.A;
tem2.B = tem1.C;
tem2.C = tem1.B;
Push(S,tem2);//a,c,b 压栈
}
else move(tem1.A,tem1.C);
}
}
int main()
{
hannio(3,'A','B','C'); //调用函数
printf("按任意键继续……");
fflush(stdin);
getchar();
return 0;
}