I calculate fibonachi row in two different ways. Why fib1 executes much longer then fib2?
public class RecursionTest {
    @Test
    public void fib1() {
        long t = System.currentTimeMillis();
        long fib = fib1(47);
        System.out.println(fib + "  Completed fib1 in:" + (System.currentTimeMillis() - t));
        t = System.currentTimeMillis();
        fib = fib2(47);
        System.out.println(fib + "  Completed fib2 in:" + (System.currentTimeMillis() - t));
    }
    long fib1(int n) {
        if (n == 0 || n == 1) {
            return n;
        } else {
            return fib1(n - 1) + fib1(n - 2);
        }
    }
    long fib2(int n) {
        return n == 0 ? 0 : fib2x(n, 0, 1);
    }
    long fib2x(int n, long p0, long p1) {
        return n == 1 ? p1 : fib2x(n - 1, p1, p0 + p1);
    }
}
The output:
2971215073  Completed fib1 in:17414
2971215073  Completed fib2 in:0
 
     
     
     
     
     
    