/** A class of static recursive mathematical functions. */
public class MathRecursion {
  

    /** Yields: n! */
    public static int factorial(int n) {
        System.out.println("Start factorial.  n = "+n);
        if (n==0) { // Base case
            System.out.println("Base case");
            return 1;
        } 
        
        // Recursive case.
        int result = n*factorial(n-1);
        System.out.println("End factorial.  n = "+n);
        return result;
    }
 
    /** Yields: the nth Fibonacci number a_n = a_{n-1}+a_{n-2}*/
    public static int fibonacci(int n) {
        System.out.println("Start fibonacci.  n = "+n);
        if (n==0 || n==1) { // Base cases
            System.out.println("Base case");
            return 1;
        }
        
        // Recursive case.
        int result = fibonacci(n-1)+fibonacci(n-2);
        System.out.println("End fibonacci.  n = "+n);
        return result;
    }
}