UNPKG

nhb-toolbox

Version:

A versatile collection of smart, efficient, and reusable utility functions and classes for everyday development needs.

84 lines (83 loc) 2.35 kB
/** * * Generates the first `limit` Fibonacci numbers. * * @param limit The number of Fibonacci numbers to generate. * @returns An array containing the first `limit` Fibonacci numbers. */ export function getFibonacciSeries(limit) { const cLimit = Number(limit); if (!Number.isFinite(cLimit) || cLimit <= 0) { return []; } if (cLimit === 1) return [0]; const series = [0, 1]; for (let i = 2; i < cLimit; i++) { series.push(series[i - 1] + series[i - 2]); } return series; } /** * * Generates the first `limit` Fibonacci numbers using recursion with memoization. * * @param limit - The number of Fibonacci numbers to generate. * @returns An array containing the first `limit` Fibonacci numbers. */ export function getFibonacciSeriesMemo(limit) { const cLimit = Number(limit); if (!Number.isFinite(cLimit) || cLimit <= 0) return []; if (cLimit === 1) return [0]; const memo = new Map([ [0, 0], [1, 1], ]); const fib = (n) => { if (memo.has(n)) return memo.get(n); const val = fib(n - 1) + fib(n - 2); memo.set(n, val); return val; }; return Array.from({ length: cLimit }, (_, i) => fib(i)); } /** * * Generator function for Fibonacci sequence up to a given limit. * * @param limit - Number of Fibonacci numbers to generate. * @param onYield - Optional callback triggered on each yield with the current value and index. * @returns A generator yielding Fibonacci numbers one by one. */ export function* fibonacciGenerator(limit, onYield) { const cLimit = Number(limit); if (!Number.isFinite(cLimit) || cLimit < 0) return; let a = 0; let b = 1; for (let i = 0; i < cLimit; i++) { onYield?.(a, i); yield a; [a, b] = [b, a + b]; } } /** * * Calculates the `n`th Fibonacci number using optimized space. * * @param index - The index (0-based) of the Fibonacci number. * @returns The index=`n`th Fibonacci number. */ export function getNthFibonacci(index) { const n = Number(index); if (!Number.isFinite(n) || n < 0) return NaN; if (n === 0) return 0; if (n === 1) return 1; let a = 0, b = 1; for (let i = 2; i <= n; i++) { [a, b] = [b, a + b]; } return b; }