The Ackermann function is a classic example of a recursive function, notable especially because it is not a primitive recursive function. It grows very quickly in value, as does the size of its call tree.



The Ackermann function is usually defined as follows:







A
(
m
,
n
)
=


{



n
+
1



if 

m
=
0




A
(
m
−
1
,
1
)



if 

m
>
0

 and 

n
=
0




A
(
m
−
1
,
A
(
m
,
n
−
1
)
)



if 

m
>
0

 and 

n
>
0.








{\displaystyle A(m,n)={\begin{cases}n+1&{\mbox{if }}m=0\\A(m-1,1)&{\mbox{if }}m>0{\mbox{ and }}n=0\\A(m-1,A(m,n-1))&{\mbox{if }}m>0{\mbox{ and }}n>0.\end{cases}}}






Its arguments are never negative and it always terminates.



Task

Write a function which returns the value of 



A
(
m
,
n
)


{\displaystyle A(m,n)}

. Arbitrary precision is preferred (since the function grows so quickly), but not required.



See also

 Conway chained arrow notation for the Ackermann function.


            NORMAL MODE IS INTEGER
            DIMENSION LIST(3000)
            SET LIST TO LIST
 
            INTERNAL FUNCTION(DUMMY)
            ENTRY TO ACKH.
LOOP        WHENEVER M.E.0
                FUNCTION RETURN N+1
            OR WHENEVER N.E.0
                M=M-1
                N=1
                TRANSFER TO LOOP
            OTHERWISE
                SAVE RETURN
                SAVE DATA M
                N=N-1
                N=ACKH.(0)
                RESTORE DATA M
                RESTORE RETURN
                M=M-1
                TRANSFER TO LOOP
            END OF CONDITIONAL
            ERROR RETURN
            END OF FUNCTION
 
            INTERNAL FUNCTION(MM,NN)
            ENTRY TO ACK.
            M=MM
            N=NN
            FUNCTION RETURN ACKH.(0)
            END OF FUNCTION
 
            THROUGH SHOW, FOR I=0, 1, I.G.3
            THROUGH SHOW, FOR J=0, 1, J.G.8
SHOW        PRINT FORMAT ACKF,I,J,ACK.(I,J)
 
            VECTOR VALUES ACKF = $4HACK(,I1,1H,,I1,4H) = ,I4*$
            END OF PROGRAM
 