¿Alguien puede explicarme por qué mi función fibonacciGenerator no funciona con este código? Entiendo por qué funciona con el segundo código, pero no entiendo por qué no funciona el primero.
function fibonacciGenerator(n) { if (n > 0) { var fArray = []; fArray.push(0); if (n >= 2) { fArray.push(1); } for (var i = 0; i < n; i++) { fArray.push(fArray[i] + fArray[i + 1]); } console.log(fArray); } } fibonacciGenerator(1); fibonacciGenerator(2);Segundo código funcionando:
function fibonacciGenerator(n) { if (n > 0) { var fArray = []; fArray.push(0); if (n >= 2) { fArray.push(1); } for (var i = 2; i < n; i++) { fArray.push(fArray[i - 1] + fArray[i - 2]); } console.log(fArray); } } fibonacciGenerator(1); fibonacciGenerator(2);El primer código está imprimiendo 2 números de Fibonacci adicionales, esto se debe a que:
primero está presionando 0 y 1 en la matriz como:
var fArray = []; fArray.push(0); if (n >=2 ){ fArray.push(1); }y luego vuelves a repetir hasta n veces. Por esta razón, imprime dos números de Fibonacci adicionales.
la solución es repetir el tiempo n-2 o usar el segundo código.
var fArray = []; fArray.push(0); if (n >= 2) { fArray.push(1); } La condición inicial es cubrir n=1: [0] y n=2: [0,1]
El segundo código funciona porque el ciclo solo comienza cuando n es mayor que i , lo que significa que se salta el ciclo con n < 2 .
Para su problema, no se salta el ciclo cuando n < 2 .
for (var i = 0; i < n; i++) { fArray.push(fArray[i] + fArray[i + 1]); } Puede imaginar que el resultado será como el siguiente cuando n < 2 con su bucle. Tenga en cuenta que el valor inicial es fArray = [0]
fArray.push(fArray[0] + fArray[1]); //fArray[1] is undefined because you only have 1 item in your array En este caso fArray[0] + fArray[1] ==> 0 + undefined = NaN
Entonces es por eso que tu lógica no funciona cuando n < 2
Para corregirlo, debe evitar el bucle si n < 2
//if n=1 or n=2, it won't trigger the loop due to `i < n-2` for (var i = 0; i < n-2; i++) { fArray.push(fArray[i] + fArray[i + 1]); }La idea de comenzar con 0 i lugar de 2, y ajustar el cuerpo del bucle en consecuencia, está bien, pero hay una cosa que la primera versión no ajustó: la condición de parada del bucle.
Al establecer i=0 , la primera versión se repite 2 veces más que la segunda versión. También debe modificar la condición final de la misma manera: en lugar de i < n , debe tener i < n - 2 , para asegurarse de que el número de iteraciones sea el mismo que en la segunda versión.
No está relacionado con su pregunta, pero es mejor colocar console.log fuera de la función. El trabajo de la función debe ser devolver la matriz, no imprimirla. Así también, cuando n > 0 es falso, debería devolver una matriz vacía.
function fibonacciGenerator(n) { var fArray = []; if (n > 0) { fArray.push(0); if (n >= 2) { fArray.push(1); } for (var i = 0; i < n - 2; i++) { fArray.push(fArray[i] + fArray[i + 1]); } } return fArray; } console.log(fibonacciGenerator(1)); console.log(fibonacciGenerator(2));