Последовательность Фибоначчи в Java: методы реализации

Вот несколько способов попрактиковаться в реализации последовательности Фибоначчи в Java:

Метод 1: итеративный подход

public static int fibonacci(int n) {
   if (n <= 1)
       return n;
   int fib = 1;
   int prevFib = 1;
   for (int i = 2; i < n; i++) {
       int temp = fib;
       fib += prevFib;
       prevFib = temp;
   }
   return fib;
}

Метод 2: рекурсивный подход

public static int fibonacci(int n) {
   if (n <= 1)
       return n;
   return fibonacci(n - 1) + fibonacci(n - 2);
}

Метод 3. Мемоизация (использование массива для хранения вычисленных значений)

public static int fibonacci(int n) {
   int[] memo = new int[n + 1];
   return fibonacciHelper(n, memo);
}
private static int fibonacciHelper(int n, int[] memo) {
   if (n <= 1)
       return n;
   if (memo[n] != 0)
       return memo[n];
   memo[n] = fibonacciHelper(n - 1, memo) + fibonacciHelper(n - 2, memo);
   return memo[n];
}

Метод 4: использование формулы Бине

public static int fibonacci(int n) {
   double phi = (1 + Math.sqrt(5)) / 2;
   return (int) Math.round(Math.pow(phi, n) / Math.sqrt(5));
}

Метод 5: использование матричного возведения в степень

public static int fibonacci(int n) {
   int[][] F = new int[][]{{1, 1}, {1, 0}};
   if (n == 0)
       return 0;
   matrixPower(F, n - 1);
   return F[0][0];
}
private static void matrixPower(int[][] F, int n) {
   int[][] M = new int[][]{{1, 1}, {1, 0}};
   for (int i = 2; i <= n; i++)
       multiply(F, M);
}
private static void multiply(int[][] F, int[][] M) {
   int x = F[0][0] * M[0][0] + F[0][1] * M[1][0];
   int y = F[0][0] * M[0][1] + F[0][1] * M[1][1];
   int z = F[1][0] * M[0][0] + F[1][1] * M[1][0];
   int w = F[1][0] * M[0][1] + F[1][1] * M[1][1];
   F[0][0] = x;
   F[0][1] = y;
   F[1][0] = z;
   F[1][1] = w;
}