# Tail Call Elimination

We have discussed (in tail recursion) that a recursive function is tail recursive if recursive call is the last thing executed by the function.

`// An example of tail recursive function ` `void` `print(` `int` `n) ` `{ ` ` ` `if` `(n < 0) ` ` ` `return` `; ` ` ` `cout << ` `" "` `<< n; ` ` ` ` ` `// The last executed statement is recursive call ` ` ` `print(n-1); ` `} ` |

*chevron_right*

*filter_none*

We also discussed that a __tail recursive is better than non-tail recursive as tail-recursion can be optimized by modern compilers. Modern compiler basically do tail call elimination to optimize the tail recursive code.__

If we take a closer look at above function, we can remove the last call with goto. Below are examples of tail call elimination.

`// Above code after tail call elimination ` `void` `print(` `int` `n) ` `{ ` `start: ` ` ` `if` `(n < 0) ` ` ` `return` `; ` ` ` `cout << ` `" "` `<< n; ` ` ` ` ` `// Update parameters of recursive call ` ` ` `// and replace recursive call with goto ` ` ` `n = n-1 ` ` ` `goto` `start; ` `} ` |

*chevron_right*

*filter_none*

**QuickSort : One more example**

QuickSort is also tail recursive (Note that MergeSort is not tail recursive, this is also one of the reason why QuickSort performs better)

`/* Tail recursive function for QuickSort ` ` ` `arr[] --> Array to be sorted, ` ` ` `low --> Starting index, ` ` ` `high --> Ending index */` `void` `quickSort(` `int` `arr[], ` `int` `low, ` `int` `high) ` `{ ` ` ` `if` `(low < high) ` ` ` `{ ` ` ` `/* pi is partitioning index, arr[p] is now ` ` ` `at right place */` ` ` `int` `pi = partition(arr, low, high); ` ` ` ` ` `// Separately sort elements before ` ` ` `// partition and after partition ` ` ` `quickSort(arr, low, pi - 1); ` ` ` `quickSort(arr, pi + 1, high); ` ` ` `} ` `} ` `// See below link for complete running code ` |

*chevron_right*

*filter_none*

The above function can be replaced by following after tail call elimination.

`/* QuickSort after tail call elimination ` ` ` `arr[] --> Array to be sorted, ` ` ` `low --> Starting index, ` ` ` `high --> Ending index */` `void` `quickSort(` `int` `arr[], ` `int` `low, ` `int` `high) ` `{ ` `start: ` ` ` `if` `(low < high) ` ` ` `{ ` ` ` `/* pi is partitioning index, arr[p] is now ` ` ` `at right place */` ` ` `int` `pi = partition(arr, low, high); ` ` ` ` ` `// Separately sort elements before ` ` ` `// partition and after partition ` ` ` `quickSort(arr, low, pi - 1); ` ` ` ` ` `// Update parameters of recursive call ` ` ` `// and replace recursive call with goto ` ` ` `low = pi+1; ` ` ` `high = high; ` ` ` `goto` `start; ` ` ` `} ` `} ` `// See below link for complete running code ` |

*chevron_right*

*filter_none*

Therefore job for compilers is to identify tail recursion, add a label at the beginning and update parameter(s) at the end followed by adding last goto statement.

**Next Article:**

QuickSort Tail Call Optimization (Reducing worst case space to Log n )

This article is contributed by **Dheeraj Jain**. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above

## Recommended Posts:

- QuickSort Tail Call Optimization (Reducing worst case space to Log n )
- Tail Recursion
- Tail Recursion for Fibonacci
- Tail recursion to calculate sum of array elements.
- Find the kth element in the series generated by the given N ranges
- Dudeney Numbers
- Find minimum positive integer x such that a(x^2) + b(x) + c >= k
- Check whether N is a Dihedral Prime Number or not
- Minimum possible final health of the last monster in a game
- Delete odd and even numbers at alternate step such that sum of remaining elements is minimized
- Minimum sub-array such that number of 1's in concatenation of binary representation of its elements is at least K
- Total number of triangles formed when there are H horizontal and V vertical lines
- Travelling Salesman Problem implementation using BackTracking
- Divide array into two parts with equal sum according to the given constraints