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: