Writing More Sophisticated Recursive Functions 
Some recursive functions have only one base case and one recursive
call.
But it is common for there to be more than one of either or both.
The following is the general structure for a recursive function.
if   (   base   case   1   ) 
   // return some simple expression 
else   if   (   base   case   2   ) 
   // return some simple expression 
else   if   (   base   case   3   ) 
   // return some simple expression 
else   if   (   recursive   case   1   )   { 
   // some work before  
   // recursive call  
   // some work after  
  } 
else   if   (   recursive   case   2   )   { 
   // some work before  
   // recursive call  
   // some work after  
  } 
else   {   // recursive case 3  
   // some work before  
   // recursive call  
   // some work after  
  } 
if   (   base   case   1   )   { 
   // return some simple expression 
} 
else   if   (   base   case   2   )   { 
   // return some simple expression 
} 
else   if   (   base   case   3   )   { 
   // return some simple expression 
} 
else   if   (   recursive   case   1   )   { 
   // some work before  
   // recursive call  
   // some work after  
  } 
else   if   (   recursive   case   2   )   { 
   // some work before  
   // recursive call  
   // some work after  
  } 
else   {   // recursive case 3  
   // some work before  
   // recursive call  
   // some work after  
  } 
Example 1 
Consider a rather simple function to determine if an integer X Y Y  =  X  -  1 
boolean   prime ( int   x ,   int   y )   { 
   if   ( y   ==   1 ) 
     return   true ; 
   else   if   ( x   %   y   ==   0 ) 
     return   false ; 	 
   else 
     return   prime ( x ,   y - 1 ); 
} 
boolean   prime ( int   x ,   int   y )   { 
   if   ( y   ==   1 )   { 
     return   true ; 
   } 
   else   if   ( x   %   y   ==   0 )   { 
     return   false ; 	 
   } 
   else { 
     return   prime ( x ,   y - 1 ); 
   } 
} 
boolean   prime ( int   x ,   int   y )   { 
   if   ( y   ==   1 ) 
     return   true ; 
   else   if   ( x   %   y   ==   0 ) 
     return   false ; 	 
   else 
     return   prime ( x ,   y -1 ); 
} 
We see that Prime 
 
Example 2 
Here is a function that has multiple recursive calls.
Given an int set isSubsetSum set sum sum  =  4 true sum  =  6 true \(8 + 1 + -3 = 6\) .
On the other hand, if sum  =  2 false n set.length 
boolean   isSubsetSum ( int   set [] ,   int   n ,   int   sum )   { 
   if   ( sum   ==   0 ) 
     return   true ; 
   if   (( n   ==   0 )   &&   ( sum   !=   0 )) 
     return   false ; 
   return   isSubsetSum ( set ,   n   -   1 ,   sum )   ||   isSubsetSum ( set ,   n   -   1 ,   sum   -   set [ n   -   1 ] ); 	 
} 
boolean   isSubsetSum ( int   set [] ,   int   n ,   int   sum )   { 
   if   ( sum   ==   0 )   { 
     return   true ; 
   } 
   if   (( n   ==   0 )   &&   ( sum   !=   0 ))   { 
     return   false ; 
   } 
   return   isSubsetSum ( set ,   n   -   1 ,   sum )   ||   isSubsetSum ( set ,   n   -   1 ,   sum   -   set [ n   -   1 ] ); 	 
} 
boolean   isSubsetSum ( int   set [],   int   n ,   int   sum )   { 
   if   ( sum   ==   0 ) 
     return   true ; 
   if   (( n   ==   0 )   &&   ( sum   !=   0 )) 
     return   false ; 
   return   isSubsetSum ( set ,   n   -   1 ,   sum )   ||   isSubsetSum ( set ,   n   -   1 ,   sum   -   set [ n   -   1 ]); 
} 
This example has two base cases and two recursive calls.
 
Example 3 
Here is a function that has multiple base cases and multiple
recursive calls.
Function paths n  =  3 paths \(1+1+1, 1+2, 2+1,\)  and 3.
int   paths ( int   n )   { 
   if   ( n   ==   1 ) 
     return   1 ; 
   if   ( n   ==   2 ) 
     return   2 ; 
   if   ( n   ==   3 ) 
     return   4 ; 
   return   paths ( n   -   1 )   +   paths ( n   -   2 )   +   paths ( n   -   3 ); 
} 
int   paths ( int   n )   { 
   if   ( n   ==   1 )   { 
     return   1 ; 
   } 
   if   ( n   ==   2 )   { 
     return   2 ; 
   } 
   if   ( n   ==   3 )   { 
     return   4 ; 
   } 
   return   paths ( n   -   1 )   +   paths ( n   -   2 )   +   paths ( n   -   3 ); 
} 
int   paths ( int   n )   { 
   if   ( n   ==   1 ) 
     return   1 ; 
   if   ( n   ==   2 ) 
     return   2 ; 
   if   ( n   ==   3 ) 
     return   4 ; 
   return   paths ( n   -   1 )   +   paths ( n   -   2 )   +   paths ( n   -   3 ); 
} 
This function has three base cases and three recursive calls.