Here are several ways to implement Fibonacci in JavaScript:
1. Basic Recursive Solution (Inefficient - O(2ⁿ))
function fibonacci(n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
2. Memoized Recursive Solution (Efficient - O(n))
function fibonacciMemo(n, memo = {}) {
if (n <= 1) return n;
if (memo[n]) return memo[n];
memo[n] = fibonacciMemo(n - 1, memo) + fibonacciMemo(n - 2, memo);
return memo[n];
}
3. Iterative Solution (Most efficient - O(n))
function fibonacciIterative(n) {
if (n <= 1) return n;
let prev = 0;
let curr = 1;
for (let i = 2; i <= n; i++) {
const next = prev + curr;
prev = curr;
curr = next;
}
return curr;
}
4. Generator Function (For sequence generation)
function* fibonacciGenerator() {
let prev = 0;
let curr = 1;
while (true) {
yield prev;
[prev, curr] = [curr, prev + curr];
}
}
// Usage:
const fibGen = fibonacciGenerator();
console.log(fibGen.next().value); // 0
console.log(fibGen.next().value); // 1
console.log(fibGen.next().value); // 1
console.log(fibGen.next().value); // 2
5. Closed-form (Binet's Formula) (O(1) but limited by floating precision)
function fibonacciBinet(n) {
const phi = (1 + Math.sqrt(5)) / 2;
return Math.round(Math.pow(phi, n) / Math.sqrt(5));
}
Usage Example:
// Get first 10 Fibonacci numbers
for (let i = 0; i < 10; i++) {
console.log(fibonacciIterative(i));
}
// Output: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
Key Points:
- The iterative solution is generally best for performance
- Recursive solution without memoization becomes extremely slow for n > 40
- Fibonacci sequence: F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2)
- For large numbers, consider using BigInt to avoid integer overflow