DEV Community

Rembrandt Reyes (He/Him)
Rembrandt Reyes (He/Him)

Posted on

8 2

Let's solve LeetCode! Fibonacci Number

Problem 509 - Fibonacci Number

The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such that each number is the sum of the two preceding ones, starting from 0 and 1. That is,

F(0) = 0,   F(1) = 1
F(N) = F(N - 1) + F(N - 2), for N > 1.
Enter fullscreen mode Exit fullscreen mode

Given N, calculate F(N).

This problem is a great introduction to recursion and a little fun concept called dynamic programming (DP).

Conceptual Overview

In mathematics, the Fibonacci numbers form a sequence called the Fibonacci sequence, such that each number is the sum of the two preceding ones starting from 0 and 1.

For example: 0, 1, 1, 2, 3, 5, ...

So how do we solve this? I mentioned earlier that this problem is an introduction to recursion and DP. It is, but there are a few ways we can solve this problem.

If you want to learn more about Dynamic Programming, check out Dynamic Programming I: Fibonacci, Shortest Paths from MIT OpenCourseWare.

So there are a few solutions:
1) Recursion
2) Recursion with DP
3) Iteratively

Each with different time and space complexities.

Coding walkthrough

Recursion only

Any function that uses Recursion you must remember that there needs to be a base condition to stop the recursion. If the base case is not reached or defined then there will be stack overflow due to memory limitations.

/**
 * @param {number} N
 * @return {number}
 */
const fib = (N) => {
    if (N < 2) return N; // base condition

    return fib(N - 2) + fib(N - 1); // recursion
}; 
Enter fullscreen mode Exit fullscreen mode

Pretty straight forward, there's a base condition that will stop the recursion when it evaluates to true.

Time & Space Complexity

Time: O(2^N) & Space: O(N)

Memoized dynamic programming algorithm

/**
 * @param {number} N
 * @return {number}
 */
const fib = (N) => {
    let memo = {}
    memo[0] = 0 // Given
    memo[1] = 1 // Given

    if (N in memo) return memo[N] // Base condition
    else  {
        memo[N] = fib(N - 1) + fib(N - 2) // Memoize results
        return memo[N] 
    }   
};
Enter fullscreen mode Exit fullscreen mode

Whenever we compute a Fibonacci number we put it into the hash table. We do this to "store" or memorize the value so we do not have to do the calculation again. We can look up the key-value in constant time.

Time & Space Complexity

This would be considered a top-down approach
Time: O(N) & Space: O(N)

Iterative approach

const fib = (N) => {
    const lastTwo = [0, 1]
    let counter = 3

    if (N <= 1) {
        return N;
    }
    if (N == 2) {
        return 1;
    }

    while (counter <= N) {
        const nextFib = lastTwo[0] + lastTwo[1]
        lastTwo[0] = lastTwo[1]
        lastTwo[1] = nextFib
        counter++
    }

    return lastTwo[0] + lastTwo[1]
};
Enter fullscreen mode Exit fullscreen mode

Time & Space Complexity

Time: O(N) & Space: O(1)

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post

Instrument, monitor, fix: a hands-on debugging session

Join Lazar for a hands-on session where you’ll build it, break it, debug it, and fix it. You’ll set up Sentry, track errors, use Session Replay and Tracing, and leverage some good ol’ AI to find and fix issues fast.

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❤️