/******************************************************/
/* This program evaluates the Ackermann function      */
/* A(m,n), and increases the size of the stack        */
/* because of the large number of recursive calls.    */
/******************************************************/
ack:
    procedure options(main,stack(2000));
    declare 
        (m,maxm,n,maxn) fixed;
    put skip list('Type max m,n: ');
    get list(maxm,maxn);
    put skip
        list('         ',(decimal(n,4) do n=0 to maxn));
    do m = 0 to maxm;
       put skip list(decimal(m,4),':');
       do n = 0 to maxn;
          put list(decimal(ackermann(m,n),4));
       end;
    end;
    stop;

    ackermann:
             procedure(m,n) returns(fixed) recursive;
             declare (m,n) fixed;
             if m = 0 then
                return(n+1);
             if n = 0 then
                return(ackermann(m-1,1));
             return(ackermann(m-1,ackermann(m,n-1)));
    end ackermann;

end ack;

