/**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.
    }
}