Aussie AI
Eliminating tail recursion
-
Book Excerpt from "Generative AI in C++"
-
by David Spuler, Ph.D.
Eliminating tail recursion
Recursion is rarely a good solution, but some types of recursive algorithms are not easy to change to loops, because they would require a stack data structure to do so. If a stack is needed, there may be little gain in removing recursion fully — it depends on how efficiently recursion is implemented by the compiler on the builtin C++ function call stack, versus your skill in hand-coding a stack data structure.
In these situations, a simpler optimization is still possible without a stack. Partial recursion elimination without the need for a stack is possible via the elimination of “tail recursion.” Tail recursion occurs when the last action of the recursive procedure is to call itself.
A simple modification changes this last recursive call to become a loop back to the top of the current invocation. For example, consider the preorder traversal of a binary tree. The simplest recursive algorithm is:
void preorder(node_ptr root)
{
if (root != NULL) {
visit(root);
preorder(root->left);
preorder(root->right); // Tail recursion here
}
}
Tail recursion can be eliminated by replacing the if statement with a while loop. The
transformation effectively reduces recursion by half, as the second recursive call is eliminated. This reduction in recursion is achieved with virtually no extra overhead!
void preorder(node_ptr root)
{
while (root != NULL) { // while loop replaces if
visit(root);
preorder(root->left);
root = root->right; // Move to right subtree
}
}
|
• Next: • Up: Table of Contents |
|
The new AI programming book by Aussie AI co-founders:
Get your copy from Amazon: Generative AI in C++ |