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