public class Fibonacci { // ------------------------------------------------------------------------------ // Fibonacci function, "the rabbit counting function" public static int fib (int n) { if (n <= 1) { return n; } else { return fib(n-1) + fib(n-2); } } public static int fibPrint (int n) { System.out.println("Entering fib(" + n + ")"); if (n <= 1) { System.out.println("Exiting fib(" + n + ") -> " + n); return n; } else { int result = fibPrint(n-1) + fibPrint(n-2); System.out.println("Exiting fib(" + n + ") -> " + result); return result; } } public static int fibIter (int n) { if (n == 0) { return 0; } else { return fibTail(n, 1, 0, 1); } } public static int fibTail (int n, int i, int fibIMinus1, int fibI) { if (n == i) { return fibI; } else { return fibTail(n, i+1, fibI, fibI + fibIMinus1); } } public static int fibIterPrint (int n) { if (n == 0) { return 0; } else { return fibTailPrint(n, 1, 0, 1); } } public static int fibTailPrint (int n, int i, int fibIMinus1, int fibI) { System.out.println("Entering fibTail(" + n + "," + i + "," + fibIMinus1 + "," + fibI + ")"); if (n == i) { System.out.println("Exiting fibTail(" + n + "," + i + "," + fibIMinus1 + "," + fibI + ") -> " + fibI); return fibI; } else { return fibTailPrint(n, i+1, fibI, fibI + fibIMinus1); } } public static void main(String [] args) { if (args.length != 2) { System.out.println("Usage: java Fib fib n"); System.exit(-1); } int n = Integer.parseInt(args[1]); if (args[0].equals("fib")) System.out.println("fib(" + n + ") => " + fib(n)); else if (args[0].equals("fibPrint")) System.out.println("fibPrint(" + n + ") => " + fibPrint(n)); else if (args[0].equals("fibIter")) System.out.println("fibIter(" + n + ") => " + fibIter(n)); else if (args[0].equals("fibIterPrint")) System.out.println("fibIterPrint(" + n + ") => " + fibIterPrint(n)); else System.out.println("Unrecogized fibonacci version: " + args[0]); } }