class FibonacciRecursionElseStrategy implements Fibonacci {
    @Override
    public long calculate(long f) {
        if(f < 0)
            throw new IllegalArgumentException();
        if(f == 0) {
            return 0;
        } else if(f == 1) {
            return 1;
        } else {
            return calculate(f-1) + calculate(f-2);
        }
    }
    @Override
    public void elapsedTime(long f, int repetitions) {
        long t1, t2;
        t1 = System.nanoTime();
        for (int i = 0; i < repetitions; i++) 
            calculate(f);
        t2 = System.nanoTime();
        System.out.println("The elapsed time is " + ((t2 - t1) / 1000000) + " [ms] using a for recursionElseIf strategy");
    }
}
class FibonacciRecursionStrategy implements Fibonacci {
    @Override
    public long calculate(long f) {
        if(f < 0)
            throw new IllegalArgumentException();
        return f == 0 || f == 1 ? f : calculate(f - 1) + calculate(f - 2);
    }
    @Override
    public void elapsedTime(long f, int repetitions) {
        long t1, t2;
        t1 = System.nanoTime();
        for (int i = 0; i < repetitions; i++) 
            calculate(f);
        t2 = System.nanoTime();
        System.out.println("The elapsed time is " + ((t2 - t1) / 1000000) + " [ms] using a for recursion strategy");
    }
}
class FibonacciLoopStrategy implements Fibonacci {
    @Override
    public long calculate(long f) {
        if(f < 0)
            throw new IllegalArgumentException();
        long num1 = 0;
        long num2 = 1;
        long sumOfTwo;
        for(int i = 0; i < f; i++) {
            sumOfTwo = num1 + num2;
            num1 = num2;
            num2 = sumOfTwo;
        }
        return num1;
    }
    @Override
    public void elapsedTime(long f, int repetitions) {
        long t1, t2;
        t1 = System.nanoTime();
        for (int i = 0; i < repetitions; i++) 
            calculate(f);
        t2 = System.nanoTime();
        System.out.println("The elapsed time is " + ((t2 - t1) / 1000000) + " [ms] using a for loop strategy");
    }
}
interface Fibonacci {
    public long calculate(long f);
    public void elapsedTime(long f, int repetitions);
}
public class FibonacciNumbers {
    public static long fibonacciRecursion(long f) {
        return f == 0 || f == 1 ? f : fibonacciRecursion(f - 1) + fibonacciRecursion(f - 2);
    }
    public static long fibonacciRecursionElseIf(long f) {
        if(f == 0) {
            return 0;
        } else if(f == 1) {
            return 1;
        } else {
            return fibonacciRecursionElseIf(f-1) + fibonacciRecursionElseIf(f-2);
        }
    }
    public static long fibonacciLoop(long total) {
        long num1 = 0;
        long num2 = 1;
        long sumOfTwo;
        for(int i = 0; i < total; i++) {
            sumOfTwo = num1 + num2;
            num1 = num2;
            num2 = sumOfTwo;
        }
        return num1;
    }
}
class Timer {
    public static void elapsedTimeFibonacciLoop(long value, int repetitions) {
        long t1, t2;
        t1 = System.nanoTime();
        for (int i = 0; i < repetitions; i++) 
            FibonacciNumbers.fibonacciLoop(value);
        t2 = System.nanoTime();
        System.out.println("The elapsed time is " + ((t2 - t1) / 1000000) + " [ms] using a for loop");
    }
    public static void elapsedTimeFibonacciRecursion(long value, int repetitions) {
        long t1, t2;
        t1 = System.nanoTime();
        for (int i = 0; i < repetitions; i++) 
            FibonacciNumbers.fibonacciRecursion(value);
        t2 = System.nanoTime();
        System.out.println("The elapsed time is " + ((t2 - t1) / 1000000) + " [ms] using a for recursion");
    }
    public static void elapsedTimeFibonacciRecursionElseIf(long value, int repetitions) {
        long t1, t2;
        t1 = System.nanoTime();
        for (int i = 0; i < repetitions; i++) 
            FibonacciNumbers.fibonacciRecursionElseIf(value);
        t2 = System.nanoTime();
        System.out.println("The elapsed time is " + ((t2 - t1) / 1000000) + " [ms] using a for recursionElseIf");
    }
}
class Start {
    public static void main(String[] args) {
        Timer.elapsedTimeFibonacciLoop(11, 10000000);
        Timer.elapsedTimeFibonacciRecursion(11, 10000000);
        Timer.elapsedTimeFibonacciRecursionElseIf(11, 10000000);
        System.out.println("" + FibonacciNumbers.fibonacciLoop(11) + " for loop");
        System.out.println("" + FibonacciNumbers.fibonacciRecursion(11) + " for recursion");
        System.out.println("" + FibonacciNumbers.fibonacciRecursionElseIf(11) + " for recursionElseIf");
        System.out.println("Strategy");
        Fibonacci loop = new FibonacciLoopStrategy();
        Fibonacci recursion = new FibonacciRecursionStrategy();
        Fibonacci recursionElse = new FibonacciRecursionElseStrategy();
        loop.elapsedTime(11, 10000000);
        recursion.elapsedTime(11, 10000000);
        recursionElse.elapsedTime(11, 10000000);
    }
}
Output: 
The elapsed time is 157 [ms] using a for loop
The elapsed time is 7591 [ms] using a for recursion
The elapsed time is 7213 [ms] using a for recursionElseIf
89 for loop
89 for recursion
89 for recursionElseIf
Strategy
The elapsed time is 158 [ms] using a for loop strategy
The elapsed time is 8094 [ms] using a for recursion strategy
The elapsed time is 8183 [ms] using a for recursionElseIf strategy
By changing the order of calculating the method from the loop and the recurrence:
class Start {
    public static void main(String[] args) {
        Timer.elapsedTimeFibonacciRecursion(11, 10000000);
        Timer.elapsedTimeFibonacciLoop(11, 10000000);
        Timer.elapsedTimeFibonacciRecursionElseIf(11, 10000000);
        System.out.println("" + FibonacciNumbers.fibonacciLoop(11) + " for loop");
        System.out.println("" + FibonacciNumbers.fibonacciRecursion(11) + " for recursion");
        System.out.println("" + FibonacciNumbers.fibonacciRecursionElseIf(11) + " for recursionElseIf");
        System.out.println("Strategy");
        Fibonacci loop = new FibonacciLoopStrategy();
        Fibonacci recursion = new FibonacciRecursionStrategy();
        Fibonacci recursionElse = new FibonacciRecursionElseStrategy();
        recursion.elapsedTime(11, 10000000);
        loop.elapsedTime(11, 10000000);
        recursionElse.elapsedTime(11, 10000000);
    }
}
The elapsed time is 7690 [ms] using a for recursion
The elapsed time is 172 [ms] using a for loop
The elapsed time is 7728 [ms] using a for recursionElseIf
89 for loop
89 for recursion
89 for recursionElseIf
Strategy
The elapsed time is 8407 [ms] using a for recursion strategy
The elapsed time is 155 [ms] using a for loop strategy
The elapsed time is 7989 [ms] using a for recursionElseIf strategy