Как при вызове функции (без аргумента) выводить следующее число Фибоначчи?
Как реализовать через функцию последовательность Фибоначчи в JavaScript, таким образом, чтобы последующее число выводилось при каждом вызове функции, не передавая аргумент?
С аргументом я сделал. Но нужно именно при каждом вызове.
Буду признателен за подробное объяснение.
Вот реализация с аргументом:
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);
Спасибо.
Ответы (3 шт):
let num1 = 0;
let num2 = 1;
function helperFibonacci () {
let a = num1;
let b = num2;
let c = num1;
num1 = num2;
num2 = num2 + c;
return a+b;
}
helperFibonacci();
Можно использовать замыкание. Создадим функцию, которая принимает на вход числа и замыкает их, возвращая функцию вычисления числа Фибоначчи. Здесь для читаемости можно разделить функцию на две: одну для генерации функции вычисления, вторую как саму функцию для вызова. Я же использовал IIFE (immediately invoked function expression) - сразу вызываемое выражение функции
const getFibonacci = ((prev = 0, next = 1) => () => {
const result = prev + next
prev = next
next = result
return result
})()
getFibonacci() // 1
getFibonacci() // 2
getFibonacci() // 3
getFibonacci() // 5
getFibonacci() // 8
Самая быстрая из найденных мной когда-либо реализаций: https://stackoverflow.com/a/52877762/14255891
const fibonacci = (n, a = 0, b = 1) => n === 0 ? a : fibonacci(n - 1, b, a + b);
const fibonacciBigInt = (n, a = 0n, b = 1n) => n === 0n ? a : fibonacciBigInt(n - 1n, b, a + b);
console.log(fibonacci(25));
console.log(fibonacciBigInt(250n).toString());
const fibGen = ()=>{
let num = 0n;
const getNext = ()=>fibonacciBigInt(++num).toString();
return getNext;
};
let fib = fibGen();
for(let i = 0; i < 249; i++) fib();
console.log(fib());
console.log(fib());
console.log(fib());
for(let i = 0; i < 747; i++) fib();
console.log(fib().split(/(\d{1,60})/g).filter(Boolean).join(' '));
for(let i = 0; i < 3999; i++) fib();
console.log(fib().split(/(\d{1,60})/g).filter(Boolean).join(' '));