DEV Community

[Comment from a deleted post]
Collapse
aethelflaed profile image
@_Geoffroy

Speaking about tail-call optimization, I wanted to precise something:

unsigned int factorial(unsigned int n)  { 
    if (n == 0) {
        return 1; 
    }
    return n * factorial(n - 1); 
} 

The last instruction in this function is a multiplication, whereas in:

unsigned int factorial(unsigned int n)  { 
    return do_factorial(1, n);
}
unsigned int do_factorial(unsigned int result, unsigned int n)  { 
    if (n == 0) {
        return result; 
    }
    return do_factorial(result * n, n - 1);
} 

The do_factorial last instruction is clearly a call to itself, thus the tail-call optimization is way more probably to happen.

Collapse
ntrupin profile image
Noah Trupin

Thanks for your input!

In this article I never provided an example for tail call optimization, but I'll be sure to either edit it into this one or make sure to incorporate samples for everything I talk about in future articles.

Collapse
aethelflaed profile image
@_Geoffroy

It may also be interesting to point out that in this example, the factorial is basically a reduction on a generator of numbers