Acabo de comenzar con Js, estaba enfrentando un problema con Js y no pude encontrar una solución similar, agradecería si alguien me ayuda.
var i = 0; var j = 1; var k = 0; function fibbo(n) { if (n === 1) { console.log([0]); } else if (n === 2) { console.log([0, 1]); } else { while (k <= n) { var l = [0, 1]; var b = l.length; l.push(l[b - 2] + l[b - 1]); k++; } } return l; } fibbo(4); console.log(l);
Asegúrese de declarar las variables localmente dentro de la función, si es ahí donde se usan. Puede tratar los casos base de manera diferente (estableciendo la propiedad de length
), y existe el método JS reciente Array#at
... :
function fibo(n) { const l = [0, 1]; while (l.length < n) l.push(l.at(-2) + l.at(-1)); l.length = n; // for the case n < 2 return l; } console.log(fibo(4));
Además de intentar acceder a l
fuera de la función, su l
en la declaración de devolución a veces no está definida cuando se proporciona 0 o 1 a la función. Más importante aún, l
no debe definirse en el ciclo while sino fuera de él.
Además, tiene variables como i
y j
que no se usan, y k
que se usa pero su alcance es problemático:
k
aumente continuamentek
se usa para rastrear el número de iteraciones, mientras que su código indica que n
debe ser la cantidad de números devueltos Aquí hay una lógica mucho más simplificada, suponiendo que se supone que n
es la cantidad de números de Fibonacci que se devolverán:
n === 1
o n === 2
, devuelve la matriz semillan
. En el bucle while, conservamos la lógica de empujar números, pero de lo contrario no es necesario que se incrementen otras variables.Ver ejemplo de prueba de concepto:
function fibbo(n) { if (n === 1) { return [0]; } else if (n === 2) { return [0, 1]; } else { const l = [0, 1]; while (n > l.length) { const b = l.length; l.push(l[b - 2] + l[b - 1]); } return l; } } console.log(fibbo(4));
Usando un bucle while
, mi opinión será la siguiente:
n = 0 || n = 1
. If n > 1
, repite n - 1
veces y dentro de cada iteración agrega la suma de los dos valores anteriores en la secuencia existente al último índice.
Una vez que el ciclo termina, toda la secuencia se recorta a la longitud de n
y se devuelve. (Esta última pieza de recorte originalmente faltaba en mi solución y se agregó después de leer la respuesta de trincot )
const fibbo = (n) => { const sequence = [0, 1]; let i = 2; let next; while(i <= n) { next = sequence[i - 2] + sequence[i - 1]; sequence[i++] = next; } return sequence; } console.log(fibbo(6));