Tail Recursion | Programming and Data Structures - Computer Science Engineering (CSE) PDF Download

What is tail recursion? 

A recursive function is tail recursive when recursive call is the last thing executed by the function. For example the following C++ function print() is tail recursive.

C
// 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);
}

Java
// An example of tail recursive function
static void print(int n)
{
    if (n < 0)
      return;
    System.out.print(" " + n);
     // The last executed statement
      // is recursive call
    print(n - 1);
}
// This code is contributed by divyeh072019

Python3
# An example of tail recursive function
def prints(n):
    if (n < 0):
        return
    print(" " + str(n),end='')
    # The last executed statement is recursive call
    prints(n-1)
    # This code is contributed by Pratham76

C#
// An example of tail recursive function
static void print(int n)
{
    if (n < 0)
      return;
    Console.Write(" " + n);
    // The last executed statement
      // is recursive call
    print(n - 1);
}
// This code is contributed by divyeshrabadiya07

Why do we care?

The tail recursive functions considered better than non tail recursive functions as tail-recursion can be optimized by compiler. The idea used by compilers to optimize tail-recursive functions is simple, since the recursive call is the last statement, there is nothing left to do in the current function, so saving the current function’s stack frame is of no use (See this for more details).

Can a non-tail recursive function be written as tail-recursive to optimize it?

Consider the following function to calculate factorial of n. It is a non-tail-recursive function. Although it looks like a tail recursive at first look. If we take a closer look, we can see that the value returned by fact(n-1) is used in fact(n), so the call to fact(n-1) is not the last thing done by fact(n)

C++
#include<iostream>
using namespace std;
// A NON-tail-recursive function.  The function is not tail
// recursive because the value returned by fact(n-1) is used in
// fact(n) and call to fact(n-1) is not the last thing done by fact(n)
unsigned int fact(unsigned int n)
{
    if (n == 0) return 1;
    return n*fact(n-1);
}
// Driver program to test above function
int main()
{
    cout << fact(5);
    return 0;
}

Java
class GFG {
    // A NON-tail-recursive function.
    // The function is not tail
    // recursive because the value
    // returned by fact(n-1) is used
    // in fact(n) and call to fact(n-1)
    // is not the last thing done by
    // fact(n)
    static int fact(int n)
    {
        if (n == 0) return 1;    
        return n*fact(n-1);
    }
    // Driver program
    public static void main(String[] args)
    {
        System.out.println(fact(5));
    }
}
// This code is contributed by Smitha.

Python3
# A NON-tail-recursive function.
# The function is not tail
# recursive because the value
# returned by fact(n-1) is used
# in fact(n) and call to fact(n-1)
# is not the last thing done by
# fact(n)
def fact(n):
    if (n == 0):
        return 1
    return n * fact(n-1)
# Driver program to test
# above function
print(fact(5))
# This code is contributed by Smitha.

C#
using System;
class GFG {
    // A NON-tail-recursive function.
    // The function is not tail
    // recursive because the value
    // returned by fact(n-1) is used
    // in fact(n) and call to fact(n-1)
    // is not the last thing done by
    // fact(n)
    static int fact(int n)
    {
        if (n == 0)
            return 1;
        return n * fact(n-1);
    }
    // Driver program to test
    // above function
    public static void Main()
    {
        Console.Write(fact(5));
    }
}
// This code is contributed by Smitha

PHP
<?php
// A NON-tail-recursive function.
// The function is not tail
// recursive because the value
// returned by fact(n-1) is used in
// fact(n) and call to fact(n-1) is
// not the last thing done by fact(n)
function fact( $n)
{
    if ($n == 0) return 1;
    return $n * fact($n - 1);
}
    // Driver Code
    echo fact(5);
// This code is contributed by Ajit
?>

Javascript
<script>
// A NON-tail-recursive function.
// The function is not tail
// recursive because the value
// returned by fact(n-1) is used
// in fact(n) and call to fact(n-1)
// is not the last thing done by
// fact(n)
function fact(n)
{
    if (n == 0)
        return 1;
    return n * fact(n - 1);
}
// Driver code
document.write(fact(5));
// This code is contributed by divyeshrabadiya07
</script>

Output :
120

The above function can be written as a tail recursive function. The idea is to use one more argument and accumulate the factorial value in second argument. When n reaches 0, return the accumulated value.

C++
#include<iostream>
using namespace std;
// A tail recursive function to calculate factorial
unsigned factTR(unsigned int n, unsigned int a)
{
    if (n == 0)  return a;
    return factTR(n-1, n*a);
}
// A wrapper over factTR
unsigned int fact(unsigned int n)
{
   return factTR(n, 1);
}
// Driver program to test above function
int main()
{
    cout << fact(5);
    return 0;
}

Java
// Java Code for Tail Recursion
class GFG {
    // A tail recursive function
    // to calculate factorial
    static int factTR(int n, int a)
    {
        if (n == 0)
            return a;
        return factTR(n - 1, n * a);
    }
    // A wrapper over factTR
    static int fact(int n)
    {
        return factTR(n, 1);
    }
    // Driver code
    static public void main (String[] args)
    {
        System.out.println(fact(5));
    }
}
// This code is contributed by Smitha.

Python3
# A tail recursive function
# to calculate factorial
def fact(n, a = 1):
    if (n == 0):
        return a
    return fact(n - 1, n * a)
# Driver program to test
#  above function
print(fact(5))
# This code is contributed
# by Smitha
# "improved by Ujwal"

C#
// C# Code for Tail Recursion
using System;
class GFG {
    // A tail recursive function
    // to calculate factorial
    static int factTR(int n, int a)
    {
        if (n == 0)
            return a;
        return factTR(n - 1, n * a);
    }
    // A wrapper over factTR
    static int fact(int n)
    {
        return factTR(n, 1);
    }
    // Driver code
    static public void Main ()
    {
        Console.WriteLine(fact(5));
    }
}
// This code is contributed by Ajit.

PHP
<?php
// A tail recursive function
// to calculate factorial
function factTR($n, $a)
{
    if ($n == 0) return $a;
    return factTR($n - 1, $n * $a);
}
// A wrapper over factTR
function fact($n)
{
    return factTR($n, 1);
}
// Driver program to test
// above function
echo fact(5);
// This code is contributed
// by Smitha
?>

Javascript
<script>
// Javascript Code for Tail Recursion
// A tail recursive function
// to calculate factorial
function factTR(n, a)
{
    if (n == 0)
        return a;
    return factTR(n - 1, n * a);
}
// A wrapper over factTR
function fact(n)
{
    return factTR(n, 1);
}
// Driver code
document.write(fact(5));
// This code is contributed by rameshtravel07
</script>

Output :
120

The document Tail Recursion | Programming and Data Structures - Computer Science Engineering (CSE) is a part of the Computer Science Engineering (CSE) Course Programming and Data Structures.
All you need of Computer Science Engineering (CSE) at this link: Computer Science Engineering (CSE)
119 docs|30 tests

Top Courses for Computer Science Engineering (CSE)

FAQs on Tail Recursion - Programming and Data Structures - Computer Science Engineering (CSE)

1. What is tail recursion?
Ans. Tail recursion is a special type of recursion where the recursive call is the last operation performed in a recursive function. In other words, when a recursive function calls itself and there is no pending operation after the recursive call, it is called tail recursion.
2. How is tail recursion different from regular recursion?
Ans. In regular recursion, the recursive call is followed by some operation, such as addition or multiplication, before returning the result. In tail recursion, the recursive call is the last operation, and there is no need to perform any operation after the recursive call. This makes tail recursion more efficient and optimizable by compilers.
3. Why is tail recursion important?
Ans. Tail recursion is important because it allows for more efficient memory usage and optimization by compilers. Since there is no need to store intermediate results or backtrack, tail recursive functions can be optimized into iterative loops, which consume less memory and have better performance.
4. How does tail recursion help in optimizing recursive functions?
Ans. Tail recursion helps in optimizing recursive functions by allowing compilers to convert them into iterative loops. This eliminates the need for stack frames to store intermediate results, reducing memory usage. It also avoids the possibility of stack overflow errors, which can occur when there are too many nested recursive calls.
5. Can all recursive functions be converted into tail recursive functions?
Ans. No, not all recursive functions can be converted into tail recursive functions. In order for a recursive function to be tail recursive, the recursive call must be the last operation in the function and there should be no pending operations after the recursive call. If there are any pending operations, the function cannot be optimized into tail recursion.
119 docs|30 tests
Download as PDF
Explore Courses for Computer Science Engineering (CSE) exam

Top Courses for Computer Science Engineering (CSE)

Signup for Free!
Signup to see your scores go up within 7 days! Learn & Practice with 1000+ FREE Notes, Videos & Tests.
10M+ students study on EduRev
Related Searches

Tail Recursion | Programming and Data Structures - Computer Science Engineering (CSE)

,

Objective type Questions

,

video lectures

,

Free

,

ppt

,

Semester Notes

,

MCQs

,

past year papers

,

Tail Recursion | Programming and Data Structures - Computer Science Engineering (CSE)

,

Sample Paper

,

Important questions

,

study material

,

Exam

,

Summary

,

Tail Recursion | Programming and Data Structures - Computer Science Engineering (CSE)

,

Extra Questions

,

mock tests for examination

,

shortcuts and tricks

,

Previous Year Questions with Solutions

,

pdf

,

Viva Questions

,

practice quizzes

;