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); } }