Ackermann function
sub A(Int $m, Int $n) {
if $m == 0 { $n + 1 }
elsif $n == 0 { A($m - 1, 1) }
else { A($m - 1, A($m, $n - 1)) }
}multi sub A(0, Int $n) { $n + 1 }
multi sub A(Int $m, 0 ) { A($m - 1, 1) }
multi sub A(Int $m, Int $n) { A($m - 1, A($m, $n - 1)) }proto A(Int \π, Int \π) { (state @)[π][π] //= {*} }
multi A(0, Int \π) { π + 1 }
multi A(1, Int \π) { π + 2 }
multi A(2, Int \π) { 3 + 2 * π }
multi A(3, Int \π) { 5 + 8 * (2 ** π - 1) }
multi A(Int \π, 0 ) { A(π - 1, 1) }
multi A(Int \π, Int \π) { A(π - 1, A(π, π - 1)) }
# Testing:
say A(4,1);
say .chars, " digits starting with ", .substr(0,50), "..." given A(4,2);Output:
Last updated