Recursion in C

Recursion

Recursion and Iteration are two different concepts of achieving a result by a number of repeated operations. Iteration involves use of for, while and do-while loops for the repeated operation until specified condition. Recursion involves a recursive function calling itself several times until specified condition.

A recursive function represents the most simpler form of a complex task. Suppose the complex task can be divided into ‘n’ simple tasks. Now after ‘n’ recursive operations involving the same recursive function, the result is obtained. Recursion could also be invoked by recursive chains in which more than one function calls each other.

Now, a recursive definition or algorithm could be defined as a simpler version of a complex task. This simpler case is repeated several times until the required result is obtained at specified condition. While writing a recursive definition, we should make sure that the recursive calls will terminate after specified operation. Otherwise, it will result in a non-terminating sequence of calls or an infinite loop.

Consider a factorial function n!. We could divide n! into simpler cases of itself and thus  generate a recursive definition as follows –

n! = n(n-1)! = n(n-1)(n-2)! = n(n-1)(n-2)!(n-3)!

Thus, the recursive definition is,

n! = 1 if n = 0
n! = n*(n-1)! if n > 0

The recursive algorithm for the function fact() could be –

if(n == 0)
   return(1);
else
    return(n*fact(n-1));

Thus the recursive routine for factorial function could be –

int fact(int n)
{ return ( n==0 ? 1 : n*(fact(n-1))); }

Below are sample recursive functions in C –

1) Factorial

Recursive definition

n! = 1 if n = 0

n! = n(n-1)! = n(n-1)(n-2)! = n(n-1)(n-2)!(n-3)!

Recursive algorithm

/*recursive algorithm for fact(n)*/
if(n == 0)
   return(1);
else
    return(n*fact(n-1));

C Program

/*C routine for fact(n)*/
int fact(int n)
{ return ( n==0 ? 1 : n*(fact(n-1))); }
2) Multiplication

Recursive definition

Let a and b be two integers then a x b is recursively defined as,

a x b = a x (b-1) + a = a x (b-2) + a + a etc ..

Recursive algorithm

/*recursive algorithm for mult(a,b)*/
    return(b == 1? a : mult(a,b-1) + a);

C Program

/*C routine for mult(a,b)*/
int mult(int a, intb)
{ return ( b == 1? a : mult(a,b-1) + a); }
3) Fibonacci Series

Recursive definition

fib(n) = 1; if n = 0 or n = 1
fib(n) = fib(n-2) + fib(n-1)

Recursive algorithm

/*recursive algorithm for fib(n)*/
    if(n == 0 || n == 1)
        return(n);
    else
        return (fib(n-2) + fib(n-1));

C Program

/*C routine for fib(n)*/
int fib(int n)
{ 
    if(n == 0 || n == 1)
        return(n);
    else
        return (fib(n-2) + fib(n-1)); 
}
4) Binary Search

Recursive algorithm

/*recursive C program for binsearch()*/
/* a[i] is the sorted global array */
/* n is the number of elements in array */

scanf("%d", &x); /*inputs number to be searched - global*/
low = 0; high = n -1;

int binsearch(int low, int high, in a[], X){

         int mid;
         if(low > high){
            return(-1);
         }
         mid = (low + high) / 2;
         return(X == a[mid] ? mid : X < a [mid] ? binsearch(low, mid-1, a[], X) : binsearch (mid+1,high,a[],X))


}

Recursive Chains

Recursive chains involves two or more than two functions calling each other. The following is the structure of two function calling each other –

a(formal parameters)                                               b(formal parameters)

{                                                                                    {

.          .            .                                                             .          .            .

.          .            .                                                             .          .            .

b(arguments);                                                            a(arguments);

}                                                                                     }

Conditions should be set that the recursive chains do not form an infinite loop.

Stacked view of recursive calls

Let us take the example of factorial function and explain the stacked view of recursive calls –

int fact(int n)
{ 
  if(n < 0)
      printf("\nInvalid Input");
  else
      return ( n==0 ? 1 : n*(fact(n-1))); 
}

—– Or —–

int fact(int n)
{ 
  int x, y;
  if(n < 0)
      printf("\nInvalid Input");
  else if(n == 0)
      return (1);
  else{
      x = n - 1;
      y = fact(x);
      return (n*y); 
  }
}

Suppose the call is –

printf("%d", fact(6));

The various stages of recursion could be viewed by using a stack. Every time a recursive call is made, new generations of local variables and parameters are generated and are pushed to a stack as a recursion is entered. Now, as the recursive function returns, each generation of local variables and parameters are referenced by popping the stack till all returns are completed. Below image shows the Recursive Stack in action –

Recursive Stack
Recursive Stack