ack:
    procedure options(main,stack(2000));
    dcl
        (m,n) fixed,
        (maxm,maxn) fixed,
        ncalls decimal(6),
        (curstack, stacksize) fixed,
        stksiz entry returns(fixed);

    put skip list('Type max m,n: ');
    get list(maxm,maxn);
        do m = 0 to maxm;
            do n = 0 to maxn;
            ncalls    = 0;
            curstack  = 0;
            stacksize = 0;
            put edit
                ('Ack(',m,',',n,')=',ackermann(m,n),
                 ncalls,' Calls,',stacksize,' Stack Bytes')
                (skip,a,2(f(2),a),f(6),f(7),a,f(4),a);
            end;
        end;
    stop;

    ackermann:
        procedure(m,n) returns(fixed) recursive;
        dcl
            (m,n) fixed;
        ncalls = ncalls + 1;
        curstack = stksiz();
        if curstack > stacksize then
            stacksize = curstack;
        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;
