First, my claim that tail recursion was the WORST kind of memory management was overblown. Although architectural changes are required for tail recursion, manual memory management could require global tracking that would lead to even greater code changes. This is academic at this point because modern imperative languages do not require memory management.

Second, tail recursion may have benefits. Take a generic looping pattern:

A bit longer, but it’s more straight-forward, especially if we consider the local definition to be a loop. It’s also more amenable to multiple results and (contrary to the implication of my previous post) more intuitive. With optional variable values, we can even eliminate the need for a local definition:

What’s more, since the recursive call can be considered a manual loop invocation with explicit transformations on its conditions and outputs, it maps more cleanly onto the concept of loop variants and invariants. In short, this may be a more sound practice with value beyond memory management.

With that said, is the ability to map from an imperative loop to a recursive function an advantage? Aren’t we just encouraging imperative thinking? Shouldn’t we encourage functional thinking all the way down?