ICS 103: Computer Programming in C
Handout-11
Topic: Recursive
Functions  
 
Instructor:
M. Waheed Aslam.
 
Objective:
·       
To know about importance, working & use of recursive
functions.
What is Recursive
Function?
·       
Functions
which call themselves repeatedly until some condition is met and then stops
calling and returns to the main program.
 
A recursive
function has two parts:
 
(1)      
Base
case (stopping condition)
(2)     General case (recursive
step: which must always get closer to base case from one invocation to
another.)
            e.g.,
                       1              for n = 0  (base case)
            n!= 
                       n * (n-1)!  for  n
> 0  (general case)
 
A recursive solution always needs a
stopping condition to prevent an infinite loop and we achieve it by using base
case.
 
Simple Example: Power
function 
/* Objective: To
see how recursive functions are coded and
                 how they
are called from main function 
*/
 
#include<stdio.h> 
power(int x, int y) // Function
definition
 {
   if(y==0) return 1;  /*
base case */
   else
    return (x*power(x,y-1)); 
/*general case */
  }
 
void main( )
{ int n1,n2, result_power; //
variable declaration
  printf("Please input two integer numbers :");
  scanf("%d %d", &n1, &n2); // input
 
  result_power = power(n1,
n2); // function call
 
  printf("%d raised to %d is =
%d\n\n",n1,n2,result_power);
  printf("%d raised to %d is = %d",n1,n2,power(n1,
n2)); // function call here also
} // end of calling main function
Sample Output :

 
·       
Any problem which we can solve using recursion,
we can also solve that problem using iteration.
 
·       
Generally,
a recursive solution is slightly less efficient, in terms of computer time,
than an iterative one because of the overhead for the extra function calls. 
·       
In
many instances, however, recursion enables us to specify a natural, simple
solution to a problem that otherwise would be difficult to solve. 
·       
For
this reason, recursion is an important and powerful tool in problem solving and
programming. 
·       
Recursion
is used widely in solving problems that are not numeric, such as proving
mathematical theorems, writing compilers, and in searching and sorting algorithms.
·       
In iterative method we use for, while, do-while for
achieving iteration for problem solving.
·       
In recursive method of problem solving we
replace for, while, do-while statements
by if statement that selects between the recursive case and the base case (i.e.,
terminating condition).
 
 
·       
In recursion, successive function call values
are stored in stack and accessed in LIFO.
 
Examples #1:
 
| 
   /*compute n! using a
  recursive definition*/  | 
  
   /*iterative solutions computes n! for n  >=0*/  | 
 
| 
   int
  factorial (int n) {  if (n == 0)     return 1; else      return( n * factorial (n-1)); }  | 
  
   int
  factorial (int n) { int
  i, product=1;   for
  (i=n; i>1; --i)    /* n * (n-1)
  * (n-2)…*/    product=product *i;    return (product);  }    | 
 
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 Example #2:   Power function: base exp.
One way to do the calculation is:
base
exp= base * base * base * … * base     
(exp times). 
 
A more compact way is:
base exp = base * base exp-1
 In this case the stopping condition (the
base case) occurs when exp=0. Since any number raised
to the 0 power is 1, we have the following situation:
                    1                         for exp=0 (base case)
 base exp
= 
                    base* base exp-1
for exp > 0 (General Recursive case).
 
Implementation of Power Function:
   Recursive
   | 
  
  Iterative 
   | 
 
| 
   #include <stdio.h> //To use scanf
  and printf double power(double base, int exp) {  if ( exp
  == 0)   return
  (1); else  return (base * power(base, exp -1)); }  | 
  
   #include<stdio.h> //To use scanf
  and printf double power(double base, int exp) { int count;double product;  
  product=base;   
  for ( count = exp-1; count >0; count --)    
  product = product * base; return ( product); } //   
  OR – see below  | 
 
| 
      | 
  
   #include<stdio.h>
  //To use
  scanf                          // and printf double
  power(double base, int exp) {
  double p=1;   while(exp !=0)   { p *= base;    exp --;}   return p;  }    | 
 
The main function to be used with
the above power functions could be as follows:
void
main( )
{ double base; int
exp;   
  printf("Please input two
numbers,\n");
  printf("the first for the base as double and\n");
  printf("the second for the exponent as integer
number:\n");
 
 scanf("%lf %d", &base, &exp); // input
 
  printf("%lf raised to %d is =
%lf",base,exp,power(base, exp)); 
} // end of calling main function
 
Sample Output 

 
 
Example #3:    Fibonacci sequence:
The Fibonacci numbers are a sequence of numbers
that have many varied uses 
the Fibonacci sequence          0, 1, 1,2,3,5,8,13,21,34
 
Fibonacci number Begins with the term 0 and 1 and
has the property that each succeeding term is the sum of the two preceding terms.
 
Fibonacci(0) is 0 
Fibonacci (1) is 1 
 
Fibonacci n is Fibonacci n-2 + Fibonacci n-1, for
n >2 
 
This is defined recursively as:
f0 = 0,               f1
= 1         fi+1 = fi
+ fi-1     for i =1,2, …
i.e. except for f0
and f1, every element is the sum of its previous two elements:  
          0,
1, 1, 3, 5, ...
The following functions implements
computing the nth Fibonacci number: 
  Iterative
  Solution
   | 
  
  Recursive
  Solution
   | 
 
| 
   #include<stdio.h> //To
  use scanf and printf int
  fibonacci (int n) { int
  i,sum1=0, sum2=1, sum;   if (n<=1)      return n;   else   { 
  for (i=2; i<=n; i++)      {  sum=sum1+sum2;         sum1=sum2;         sum2=sum;      }      return sum;   } }  | 
  
   #include<stdio.h>
  //To use scanf and printf int
  fibonacci(int n) {  if (n<=1)         return n;     else         return (fibonacci(n-1)             + fibonacci(n-2)); }    | 
 
 void main( )// main function
for fibonacci functions
{ int n, result;   
  printf("Please enter n to find the nth Fibonacci
number:");
  scanf("%d", &n); // input
  result=fibonacci(n); 
  printf("\nThe fibonacci number for n = %d is
%d\n",n,result); 
} //
Sample Output :

 
·       
In
recursive function call, Dynamic memory allocation occurs at run
time. 
·       
With
each function call, an activation record contains the state of a given
function, that is, the address of the current instruction and the values of all
the local variables, is created and pushed on the run-time stack.  
 
·       
Each
time a function calls itself, an activation record is
created and pushed on the run-time stack. 
·       
The
first call thus appears at the bottom of the sack. 
 
·       
The
last call (the base case) appears at the top of the stack.  
·       
At
that time the top activation record is popped from the stack and the function
returns its first value. 
·       
The
process continues until all activation records are popped from the stack,
at which time the recursion stops.