本文系转帖(进行了一定的修改)
数组版本:
设函数有m个外部参数,n个内部变量。
(有返回值的函数其返回值设为内部变量,静态数据类型设为栈外部数据)
1:设置结构(记录)使有(m+n+1)个成员。
struct stack{
Para p1,p2,p3,...,pm;
//外部参数
Inner q1,q2,q3,...,qn;
//内部变量
short adr;
//出口标志
};
2:建立适当长度的该结构数组、建立指针。
struct stack st[N];
//栈数组
short sp;
//栈指针
3:参数初始化。
st[0].p1=a;
st[0].p2=b;
st[0].p3=c;
... ...;
st[0].adr=0;
label_0:
4:在第n个递归调用处改成:
进栈;(sp++)
操作外部参数对应成员;
st[sp].adr=n;
goto label_0;
label_n:
从下级递归中获取数据;
退栈;(sp--)
操作内部变量对应成员;
5:变量当前层化。所有变量全写成st[sp]的对应成员
6:在每一个出口处加上:
switch(st[sp].adr){
case 1:goto label_1;
case 2:goto label_2;
... ...;
};
7:化简程序。
链表版本:
设函数有m个外部参数,n个内部变量。
(有返回值的函数其返回值设为内部变量,静态数据类型设为栈外部数据)
1:设置结构(记录)使有(m+n+1)个成员。
struct stack{
Para p1,p2,p3,...,pm;
//外部参数
Inner q1,q2,q3,...,qn;
//内部变量
short adr;
//出口标志
struct stack *nxt;
};
2:建立适当长度的该结构数组、建立指针。
struct stack *stk,*mdi;
//栈指针
3:参数初始化。
stk=new stack;
stk->p1=a;
stk->p2=b;
stk->p3=c;
... ...;
stk->adr=0;
label_0:
4:在第n个递归调用处改成:
进栈;(mdi=new stack;mdi->nxt=stk,stk=mdi)
操作外部参数对应成员;
stk->adr=n;
goto label_0;
label_n:
从下级递归中获取数据;
退栈;(mdi=stk->nxt,delete stk,stk=mdi)
操作内部变量对应成员;
5:变量当前层化。所有变量全写成stk的对应成员
6:在每一个出口处加上:
switch(stk->adr){
case 1:goto label_1;
case 2:goto label_2;
... ...;
};
7:化简程序。(记得推出前将最初的栈清除)
看看就好,千万不要在实际程序里使用,c/c++的递归调用处理的很不错,如果你按上面改了,效率反而会大大下降!我就是悲剧的反例啊!