/************************************************/ /* This program tests the STKSIZ function while */ /* evaluating a RECURSIVE procedure. */ /************************************************/ ack: procedure options(main,stack(2000)); declare (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; declare (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;