home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pl1 / ackerman next >
Text File  |  1988-11-30  |  2KB  |  72 lines

  1. PRINT(sysprint,'M and N (separated by a space)? ');
  2. m=GETINT(sysin); n=GETINT(sysin);
  3. PUTCRLF(sysprint);
  4. stack_ptr=0;
  5. stack_ptr=stack_ptr+1;
  6. stack(stack_ptr)=m;
  7. stack_ptr=stack_ptr+1;
  8. stack(stack_ptr)=n;
  9. stack_ptr=stack_ptr+1;
  10. stack(stack_ptr)=0;
  11. stack_ptr=stack_ptr+1;
  12. stack(stack_ptr)=0;
  13. finished=FALSE;
  14. DO WHILE(! finished);
  15.   recurse=FALSE;
  16.   m=stack(stack_ptr-3);
  17.   n=stack(stack_ptr-2);
  18.   IF m = 0 THEN
  19.     stack(stack_ptr-1)=n+1;
  20.   ELSE
  21.     IF n = 0 THEN
  22.       DO;
  23.         stack_ptr=stack_ptr+1;
  24.         stack(stack_ptr)=m-1;
  25.         stack_ptr=stack_ptr+1;
  26.         stack(stack_ptr)=1;
  27.         stack_ptr=stack_ptr+1;
  28.         stack(stack_ptr)=0;
  29.         stack_ptr=stack_ptr+1;
  30.         stack(stack_ptr)=1;
  31.         recurse=TRUE;
  32.       END;
  33.     ELSE
  34.       DO;
  35.         stack_ptr=stack_ptr+1;
  36.         stack(stack_ptr)=m;
  37.         stack_ptr=stack_ptr+1;
  38.         stack(stack_ptr)=n-1;
  39.         stack_ptr=stack_ptr+1;
  40.         stack(stack_ptr)=0;
  41.         stack_ptr=stack_ptr+1;
  42.         stack(stack_ptr)=2;
  43.         recurse=TRUE;
  44.       END;
  45.   DO WHILE((! recurse) & (! finished));
  46.     return_address=stack(stack_ptr);
  47.     IF return_address = 0 THEN
  48.       finished=TRUE;
  49.     ELSE
  50.       IF return_address = 1 THEN
  51.         DO;
  52.           stack(stack_ptr-5)=stack(stack_ptr-1);
  53.           stack_ptr=stack_ptr-4;
  54.         END;
  55.       ELSE
  56.         IF return_address = 2 THEN
  57.           DO;
  58.             stack(stack_ptr-2)=stack(stack_ptr-1);
  59.             stack(stack_ptr-3)=stack(stack_ptr-3)-1;
  60.             stack(stack_ptr)=3;
  61.             recurse=TRUE;
  62.           END;
  63.         ELSE
  64.           DO;
  65.             stack(stack_ptr-5)=stack(stack_ptr-1);
  66.             stack_ptr=stack_ptr-4;
  67.           END;
  68.   END;
  69. END;
  70. PRINT(sysprint,'Acker(',stack(stack_ptr-3),',',
  71.  stack(stack_ptr-2),') = ',stack(stack_ptr-1));
  72.