How to resolve the algorithm Ackermann function step by step in the jq programming language
Published on 12 May 2024 09:40 PM
How to resolve the algorithm Ackermann function step by step in the jq programming language
Table of Contents
Problem Statement
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:
Its arguments are never negative and it always terminates.
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.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Ackermann function step by step in the jq programming language
Source code in the jq programming language
# input: [m,n]
def ack:
.[0] as $m | .[1] as $n
| if $m == 0 then $n + 1
elif $n == 0 then [$m-1, 1] | ack
else [$m-1, ([$m, $n-1 ] | ack)] | ack
end ;
range(0;5) as $i
| range(0; if $i > 3 then 1 else 6 end) as $j
| "A(\($i),\($j)) = \( [$i,$j] | ack )"
# jq -n -r -f ackermann.jq
A(0,0) = 1
A(0,1) = 2
A(0,2) = 3
A(0,3) = 4
A(0,4) = 5
A(0,5) = 6
A(1,0) = 2
A(1,1) = 3
A(1,2) = 4
A(1,3) = 5
A(1,4) = 6
A(1,5) = 7
A(2,0) = 3
A(2,1) = 5
A(2,2) = 7
A(2,3) = 9
A(2,4) = 11
A(2,5) = 13
A(3,0) = 5
A(3,1) = 13
A(3,2) = 29
A(3,3) = 61
A(3,4) = 125
A(3,5) = 253
A(4,0) = 13
# input: [m,n, cache]
# output [value, updatedCache]
def ack:
# input: [value,cache]; output: [value, updatedCache]
def cache(key): .[1] += { (key): .[0] };
def pow2: reduce range(0; .) as $i (1; .*2);
.[0] as $m | .[1] as $n | .[2] as $cache
| if $m == 0 then [$n + 1, $cache]
elif $m == 1 then [$n + 2, $cache]
elif $m == 2 then [2 * $n + 3, $cache]
elif $m == 3 then [8 * ($n|pow2) - 3, $cache]
else
(.[0:2]|tostring) as $key
| $cache[$key] as $value
| if $value then [$value, $cache]
elif $n == 0 then
([$m-1, 1, $cache] | ack)
| cache($key)
else
([$m, $n-1, $cache ] | ack)
| [$m-1, .[0], .[1]] | ack
| cache($key)
end
end;
def A(m;n): [m,n,{}] | ack | .[0];
A(4;1)
65533
A(4;2), A(3;1000000) | tostring | length
19729
301031
You may also check:How to resolve the algorithm Memory layout of a data structure step by step in the D programming language
You may also check:How to resolve the algorithm Walk a directory/Recursively step by step in the Red programming language
You may also check:How to resolve the algorithm Sorting algorithms/Strand sort step by step in the Racket programming language
You may also check:How to resolve the algorithm Mutual recursion step by step in the APL programming language
You may also check:How to resolve the algorithm Sleep step by step in the Nim programming language