Cached factorial in Raku

Factorial, being a classical task for practising algorithms, is a great example to demonstrate the features of Raku. Let us update the code so that it caches the already calculated values.

Factorial, being a classical task for drilling algorithms, is a great example to demonstrate the features of Raku. You can find a number of different implementations in the corresponding section of my book Using Raku.

Let us update the code so that it caches the already calculated values.

I am using multi-functions to distinguish between zero and non-zero arguments:

multi sub postfix:<!>(0) { 1 }

multi sub postfix:<!>($n) {
    $n * ($n - 1)!
}

Let us add a state variable to the second variant of the function so that it remembers the values and returns it immediately if it is already known:

multi sub postfix:<!>(0) { 1 }

multi sub postfix:<!>($n) {
    state %factorial;

    %factorial{$n} //= $n * ($n - 1)!
}

Notice how you can assign the new value if needed and return the result in a single line without any if constructs. Also don’t forget the the last computed value is returned by the function.

As a homework, add some printing instructions to see how the function fills up the cache and test it on a few randomly ordered numbers:

say 5!;
say 7!;
say 4!;

Also take a look at the Memoize module.

3 thoughts on “Cached factorial in Raku”

Leave a Reply

Your email address will not be published. Required fields are marked *