Вот несколько способов попрактиковаться в реализации последовательности Фибоначчи в 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;
}