F = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...}
F 0 = 0, F 1 = 1, F n = F n - 1 + F n - 2 ;
norte ≥ 0, norte ∈ Z
Obtener los primeros n números de Fibonacci en Java
Supongamos que tenemos la tarea de obtener los primeros n números de Fibonacci.-
caso 0.1:
Nos llega un cierto número n:
int[] arr = new int[n]; arr[0] = 0; arr[1] = 1; for (int i = 2; i < arr.length; ++i) { arr[i] = arr[i - 1] + arr[i - 2]; }
Creamos una matriz de tamaño n. Los primeros dos elementos serán iguales a cero y uno, y los elementos restantes se obtienen siguiendo este ciclo y usando los números anteriores de la matriz.
Y mostramos:
for (int i = 0; i < arr.length; ++i) { System.out.println(arr[i]); }
Establecer int n = 10;
Y obtenemos:
0 1 1 2 3 5 8 13 21 34
-
para el caso 1.1 la solución en realidad no es diferente:
int[] arr = new int[n]; arr[0] = 1; arr[1] = 1; for (int i = 2; i < arr.length; ++i) { arr[i] = arr[i - 1] + arr[i - 2]; }
Todo lo que necesitábamos cambiar era el primer elemento de la matriz arr[0]: de 0 a 1. En consecuencia, los primeros 10 elementos serán:
1 1 2 3 5 8 13 21 34 55
Primeros n números de Fibonacci vía streaming
Pero queremos mostrar nuestro nivel. Entonces, veamos cómo se vería esta solución usando stream .-
para 0,1:
Stream.iterate(new int[]{0, 1}, arr -> new int[]{arr[1], arr[0]+ arr[1]}) .limit(n) .map(y -> y[0]) .forEach(x -> System.out.println(x));
El método de iteración estático de la clase Stream devuelve una secuencia ordenada infinita creada aplicando la función a la matriz inicial arr. En nuestro caso, la función es establecer la regla para componer cada nuevo array, en base al anterior. Como resultado, obtendremos un flujo de matrices:
{0,1} {1,1} {1, 2} {2, 3} {3, 5} {5, 8} {8, 13} {13, 21} {21, 34} {34, 55} …..
Pero habrá un número infinito de ellos y, por lo tanto, usando .limit(n) reducimos el número de elementos al primer n (en nuestro caso a 10).
Sin embargo, no necesitamos una secuencia de matrices, por lo que usando .map(y -> y[0]) seleccionamos el primer elemento de cada matriz y obtenemos una secuencia con los números que necesitamos y la imprimimos en la consola usando forEach. .
Se ve más genial, ¿no?
siendo los primeros elementos 1,1, este código también será casi el mismo:Stream.iterate(new int[]{1, 1}, arr -> new int[]{arr[1], arr[0]+ arr[1]}) .limit(n) .map(y -> y[0]) .forEach(x -> System.out.println(x));
Nuevamente, las diferencias están en el elemento inicial: en lugar de {0, 1} configuramos {1, 1}
En realidad, los resultados serán los mismos que en el ejemplo anterior.
Suma de números de Fibonacci
¿Qué pasaría si nos pidieran obtener la suma de los números de Fibonacci hasta el enésimo elemento inclusive? Esto no debería causarnos ninguna dificultad. Tomemos una solución con una secuencia y reemplacemos forEach con un par de métodos más:-
para 0,1:
int n = 10; int result = Stream.iterate(new int[]{0, 1}, arr -> new int[]{arr[1], arr[0]+ arr[1]}) .limit(n) .map(t -> t[0]) .mapToInt(Integer::intValue) .sum(); System.out.println(result);
Usando .mapToInt(Integer::intValue) convertimos nuestra secuencia en un IntStream numérico y usamos su método .sum() para obtener la suma de todos los elementos.
- para el caso con 1,1 elementos iniciales, en lugar de {0, 1} configuramos {1, 1}.
Obtener el enésimo número de la serie de Fibonacci
A veces se le pide que imprima no una serie de números, sino específicamente el enésimo número de la serie de Fibonacci. Por regla general, esto sólo facilita la tarea, ya que puede adaptar fácilmente soluciones anteriores para ello. Bueno, ¿qué pasa con la solución del problema mediante la recursividad?-
para 0,1:
public int getFibonacciValue(int n) { if (n <= 1) { return 0; } else if (n == 2) { return 1; } else { return getFibonacciValue(n - 1) + getFibonacciValue(n - 2); } }
Para ejecutar el algoritmo con 0,1, es necesario especificar que cuando intentamos obtener el primer elemento, obtenemos 0 y el segundo - 1. De hecho, nosotros, como en las soluciones anteriores, necesitamos configurar los dos primeros. elementos.
-
la implementación para 1.1 será ligeramente diferente:
public int getFibonacciValue(int n) { if (n == 0) { return 0; } else if (n == 1) { return 1; } else { return getFibonacciValue(n - 1) + getFibonacciValue(n - 2); } }
En este caso, sólo necesitamos establecer el primer elemento como 1, ya que el segundo elemento será el mismo y la respuesta del método será la misma.
Al mismo tiempo, configuramos la reacción del método en 0, porque si no lo configuramos, cuando viene 2 como argumento, se llama al mismo método de forma recursiva, pero con el argumento 0. A continuación, se ejecutará el mismo método. , pero con números negativos, y así hasta el infinito negativo. Como resultado, recibiremos un StackOverflowError .
GO TO FULL VERSION