58 lines
801 B
Plaintext
58 lines
801 B
Plaintext
DEFINE MAXSIZE="1000"
|
|
CARD ARRAY stack(MAXSIZE)
|
|
CARD stacksize=[0]
|
|
|
|
BYTE FUNC IsEmpty()
|
|
IF stacksize=0 THEN
|
|
RETURN (1)
|
|
FI
|
|
RETURN (0)
|
|
|
|
PROC Push(BYTE v)
|
|
IF stacksize=maxsize THEN
|
|
PrintE("Error: stack is full!")
|
|
Break()
|
|
FI
|
|
stack(stacksize)=v
|
|
stacksize==+1
|
|
RETURN
|
|
|
|
BYTE FUNC Pop()
|
|
IF IsEmpty() THEN
|
|
PrintE("Error: stack is empty!")
|
|
Break()
|
|
FI
|
|
stacksize==-1
|
|
RETURN (stack(stacksize))
|
|
|
|
CARD FUNC Ackermann(CARD m,n)
|
|
Push(m)
|
|
WHILE IsEmpty()=0
|
|
DO
|
|
m=Pop()
|
|
IF m=0 THEN
|
|
n==+1
|
|
ELSEIF n=0 THEN
|
|
n=1
|
|
Push(m-1)
|
|
ELSE
|
|
n==-1
|
|
Push(m-1)
|
|
Push(m)
|
|
FI
|
|
OD
|
|
RETURN (n)
|
|
|
|
PROC Main()
|
|
CARD m,n,res
|
|
|
|
FOR m=0 TO 3
|
|
DO
|
|
FOR n=0 TO 4
|
|
DO
|
|
res=Ackermann(m,n)
|
|
PrintF("Ack(%U,%U)=%U%E",m,n,res)
|
|
OD
|
|
OD
|
|
RETURN
|