/**Demonstration of three types of recursion
*
* @author TK Rogers
* @version 10-16-08
*/
public class RecursiveMultiplication {
public static void main ( ) {
System.out.println ( "Note that \"a\" remains constant while \"b\"
decreases by 1 in each iteration." ) ;
System.out.println ( "4 x 2 = " + multiply ( 4, 2 ) + "\n" ) ;
// ^ creates a new line.
System.out.println ( "Note that \"name\" remains constant while \"n\"
decreases by 1 in each iteration." ) ;
hi ( "Bob" , 3 ) ;
System.out.println ( "\nNote that \"x\" decreases by 1 in each iteration." ) ;
System.out.println ( "       Total = " + addFractions ( 3 ) ) ;
}

/** Purpose: Method returns a * b
*  Preconditions: two integers
*  Postconditions: returns a * b.
*/
public static int multiply ( int a , int b ) {
System.out.println ( "a = " + a + ", b = " + b ) ;
if (b <= 1) { //stops the recursion
return a ;
}
return a + multiply ( a, b - 1 ) ;
}
/**Purpose: Method causes "hello " + name to be output on n lines
*  Preconditions: a string representing a name to output, an integer
*                           representing the number of times the sting is output.
*  Postconditions: none.*/
static int hi ( String name, int n ) {
if ( n == 0 ) { //stops the recursion
System.out.println ( "saying hello to " + name + " has stopped, n = " + n ) ;
return 0;
}
System.out.println ( "hello " + name + ", n = " + n ) ;
return hi ( name, n - 1 ) ;
}

/**Purpose: Method returns the series 1/1 + 1/2 + 1/3 + ... + 1/x
* Preconditions: an integer x for the above series
* Postconditions: returns the value for the above series. */
static double addFractions ( int x ) {
System.out.println ( "x = " + x + ", 1.0 / x = " + 1.0 / x) ;
if ( x <= 1 ) return 1.0 ; //stops the recursion
else return 1.0 / x + addFractions ( x - 1 ) ;

// If x = 3, the recursion runs as follows:
// return  1.0 / 3 + addFractions ( x-1 ) ;
// return  1.0 / 2 + addFractions ( x-1 ) ;
// return  1.0 / 1;
// At this point, the computer adds
//  the 3 bold print values from
// bottom to top.
}
}