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.


 
நிரல்பாகம் அகெர்மன்(முதலெண், இரண்டாமெண்)
 
  @((முதலெண் < 0) || (இரண்டாமெண் < 0)) ஆனால்
 
    பின்கொடு -1
 
  முடி
 
  @(முதலெண் == 0) ஆனால்
 
    பின்கொடு இரண்டாமெண்+1
 
  முடி
 
  @((முதலெண் > 0) && (இரண்டாமெண் == 00)) ஆனால்
 
    பின்கொடு அகெர்மன்(முதலெண் - 1, 1)
 
  முடி
 
  பின்கொடு அகெர்மன்(முதலெண் - 1, அகெர்மன்(முதலெண், இரண்டாமெண் - 1))
 
முடி
 
அ = int(உள்ளீடு("ஓர் எண்ணைத் தாருங்கள், அது பூஜ்ஜியமாகவோ, அதைவிடப் பெரியதாக இருக்கலாம்: "))
ஆ = int(உள்ளீடு("அதேபோல் இன்னோர் எண்ணைத் தாருங்கள், இதுவும் பூஜ்ஜியமாகவோ, அதைவிடப் பெரியதாகவோ இருக்கலாம்: "))
 
விடை = அகெர்மன்(அ, ஆ)
 
@(விடை < 0) ஆனால்
 
  பதிப்பி "தவறான எண்களைத் தந்துள்ளீர்கள்!"
 
இல்லை
 
  பதிப்பி "நீங்கள் தந்த எண்களுக்கான அகர்மென் மதிப்பு: ", விடை
 
முடி
 