**Advent Calendar 2019**

### | **Day 6** | **Day 7** | **Day 8** |

The gift is presented by **Jaldhar H. Vyas**. Today he is talking about his solutions to **Task #1: Ackermann Function** of **“The Weekly Challenge - 017”**.

#### Create a script to demonstrate Ackermann function as defined in wikipedia.

As per the example in wiki page.

```
A(1, 2) = A(0, A(1, 1))
= A(0, A(0, A(1, 0)))
= A(0, A(0, A(0, 1)))
= A(0, A(0, 2))
= A(0, 3)
= 4
```

This can be easily modeled by a **recursive** function with **two special cases**. (Plus **an extra** check to make sure the inputs are **positive integers**.) Here is the **Perl** version.

```
sub ackermann {
my ($m, $n) = @_;
if ($m < 0 || $n < 0) {
return undef;
}
if ($m == 0) {
return $n + 1;
}
if ($n == 0) {
return ackermann($m - 1, 1);
}
return ackermann($m - 1, ackermann($m, $n - 1));
}
```

In **Raku**, we can use the **multi** sub functionality for **each case** and **parameter validation** is built in.

```
multi sub ackermann (
Int $m where { $m == 0 },
Int $n where { $n >= 0 },
) {
return $n + 1;
}
multi sub ackermann (
Int $m where { $m >= 0 },
Int $n where { $n == 0 },
) {
return ackermann($m - 1, 1);
}
multi sub ackermann (
Int $m where { $m >= 0 },
Int $n where { $n >= 0 },
) {
return ackermann($m - 1, ackermann($m, $n - 1));
}
```

If you have any suggestion then please do share with us perlweeklychallenge@yahoo.com.