Necesito implementar una secuencia de Fibonacci Оa través de una función para mi tarea. Y necesito implementar una función para que cada llamada posterior genere el siguiente número en la secuencia. Parece simple si pasa un argumento a la función, pero la asignación no me permite hacerlo. He implementado esta función con un argumento, el código se muestra a continuación:
function helperFibonacci(n) { let number1 = 0; let number2 = 1; for (i = 0; i < n; i++) { let current = number1 + number2; number1 = number2; number2 = current; console.log(current); } } helperFibonacci(2);Por favor, ayúdame a implementar esta función sin pasar un argumento. ¡Gracias!
Cambie number1 y number2 a variables globales y elimine el bucle.
let number1 = 0; let number2 = 1; function helperFibonacci() { let current = number1 + number2; number1 = number2; number2 = current; console.log(current); } for (let i = 0; i < 10; i++) { helperFibonacci(); }Prueba con este, funciona muy bien, ten una buena codificación :)
function fib(n) { let fibList = []; if (n < 2) { fibList.push(0); } else { let prev = 0; let curr = 1; fibList.push(prev, curr); for (let i = 2; i < n; i++) { const next = prev + curr; prev = curr; curr = next; fibList.push(curr); } } console.log(fibList); }OPCIÓN 1 USO DE LAS FUNCIONES DEL GENERADOR
Creo que la forma correcta de hacer esto es usar una función de Generador. Estas son funciones destinadas a devolver secuencias, están diseñadas para este tipo de situaciones en las que tiene una secuencia que puede calcular en función de una fórmula y desea obtener el siguiente valor a voluntad.
Entonces, digamos que tiene una fórmula simple para calcular el n-ésimo número de fibonacci
function fibonacci(n = 0) { if (n < 0){ throw 'Fibonacci not defined for negative numbers'} if (n < 2) { return n}; return fibonacci(n - 1) + fibonacci(n - 2); }entonces simplemente envuélvalo en una función de generador (usando la sintaxis de función *, tenga en cuenta el *)
function* fibonacciGenerator() { var index = 0; while (true){ // yields the next fibonacci yield fibonacci(index++); } } Luego puede usarlo creando un nuevo generador y llamando a la siguiente función para recuperar el siguiente elemento en la secuencia. Tenga en cuenta que while true aquí representa que la secuencia es infinita, es decir, nunca termina y puedo seguir obteniendo más y más elementos. Esto no se convierte en un bucle infinito debido a la palabra clave yield
let fibonacciSequence = fibonacciGenerator(); fibonacciSequence.next().value; // 0 fibonacciSequence.next().value; // 1 fibonacciSequence.next().value; // 1 fibonacciSequence.next().value; // 2Puede leer más sobre las funciones del generador aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function *
NO USAR LAS FUNCIONES DEL GENERADOR
Si no está familiarizado con las funciones del generador o no puede usarlas, puede hacerlo con una función normal y guardar el "estado". No recomiendo en absoluto guardarlo en una variable global porque se considera unamala práctica . Pero puedes crear un cierre.
Los cierres son como funciones con su propio alcance o entorno donde pueden tener variables.
function fibonacciGenerator() { var index = 0; return function () { return fibonacci(index++); } }entonces utilízalo
let fibonacciSequence = fibonacciGenerator(); fibonacciSequence(); // 0 fibonacciSequence(); // 1 fibonacciSequence(); // 1 fibonacciSequence(); // 2tenga en cuenta que la estructura es similar a la de los generadores, pero en su lugar tenemos funciones normales.
Puede leer más sobre los cierres aquí: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures