2.Îðãàíèçàöèÿ ñïèñêîâ è èõ îáðàáîòêà.
2.4.Ðåêóðñèÿ.
Ñëåäóþùàÿ ïðîãðàììà âû÷èñëÿåò ôóíêöèþ Àêêåðìàíà ñ èñïîëüçîâàíèåì ðåêóðñèâíîé ôóíêöèè ackr è âñïîìîãàòåëüíîé ôóíêöèè smacc:
/* ðåêóðñèâíîå âû÷èñëåíèå ôóíêöèè Àêêåðìàíà */
# include
main () /* âûçûâàþùàÿ */
{ int x,y,n,t; /* ôóíêöèÿ */
int ackr(int, int, int);
scanf("%d %d %d",&n,&x,&y);
t=ackr(n,x,y);
printf("%d",t);
}
int smacc( int n,int x ) /* âñïîìîãàòåëüíàÿ */
{ switch (n) /* ôóíêöèÿ */
{ case 0: return(x+1);
case 1: return (x);
case 2: return (0);
case 3: return (1);
default: return (2);
}
}
int ackr( int n, int x, int y) /* ðåêóðñèâíàÿ */
{ int z; /* ôóíêöèÿ */
int smacc( int,int);
if(n==0 || y==0) z=smacc(n,x);
else { z=ackr(n,x,y-1); /* ðåêóðñèâíûå */
z=ackr(n-1,z,x); } /* âûçîâû ackr(...) */
return z;
}
Ìîäèôèöèðóÿ ôóíêöèè main è ackr â ñîîòâåòñòâèè ñ èçëîæåííûì ìåòîäîì ïîëó÷èì ñëåäóþùóþ ïðîãðàììó:
/* Ýêâèâàëåíòíàÿ íåðåêóðñèâíàÿ ïðîãðàììà */
/* äëÿ âû÷èñëåíèÿ ôóíêöèè Àêêåðìàíà */
#include
#include
int main()
{ typedef struct st
{ int i,j,k,z,lr;
struct st *pst;
} ST;
ST *u, *dl=NULL;
int l,x,y,n;
int smacc(int,int);
int an,ax,ay,rz,t;
scanf("%i %i %i",&n,&x,&y);
an=n;ax=x;ay=y;l=1; /* - çàìåíà âûçîâà - */
goto ackr; /* t=ackr(n,x,y); */
l1: t=rz; /* - - - - - - - - */
printf("\n %d ",t);
goto jackr;
/* íà÷àëî ôðàãìåíòà çàìåíÿþùåãî ôóíêöèþ ackr */
ackr:
u=( ST *) malloc( sizeof (ST) );
u->i=an;
u->j=ax;
u->k=ay;
u->lr=l;
u->pst=dl;
dl=u;
if (an==0||ay==0)
dl->z=smacc(an,ax);
else
{
an=dl->i; /* - çàìåíà âûçîâà - */
ax=dl->j; /* */
ay=dl->k-1; /* z=ackr(n,x,y-1); */
l=2; /* */
goto ackr; /* */
l2: dl->z=rz; /* - - - - - - - - */
an=dl->i-1; /* - çàìåíà âûçîâà - */
ax=rz; /* */
ay=dl->j; /* z=ackr(n-1,z,x); */
l=3; /* */
goto ackr; /* */
l3: dl->z=rz; /* - - - - - - - - */
}
rz=dl->z; /* - - - - - - - - */
an=dl->i; /* */
ax=dl->j; /* çàìåíà */
ay=dl->k; /* */
l=dl->lr; /* îïåðàòîðà */
u=dl; /* */
dl=u->pst; /* return z ; */
free(u); /* */
switch(l) /* */
{ case 1: goto l1; /* */
case 2: goto l2; /* */
case 3: goto l3; /* */
} /* - - - - - - - - */
jackr:
}
int smacc( int n,int x ) /* âñïîìîãàòåëüíàÿ ôóíêöèÿ */
{ switch (n)
{ case 0: return(x+1);
case 1: return (x);
case 2: return (0);
case 3: return (1);
default: return (2);
}
}