Quick Info

Category: Dynamic Programming
Time Complexity: O(n)
Space Complexity: O(1)
Input Type: Integer

Fibonacci (Dynamic Programming)

Description

The Fibonacci sequence is a series of numbers where each number is the sum of the two preceding ones, usually starting with 0 and 1. Dynamic programming optimizes the calculation by storing previously computed values.

F(n) = F(n-1) + F(n-2)

where F(0) = 0 and F(1) = 1

How It Works

  1. Initialize variables for the two previous numbers (0 and 1)
  2. For each step up to n:
    • Calculate next number by adding previous two
    • Update previous numbers
  3. Return the final calculated number

Visualization

Enter a number to calculate its Fibonacci value

Complexity Analysis

Time Complexity

O(n) where:

  • n is the input number
  • Each number is calculated exactly once
  • No recursive calls or redundant calculations

Space Complexity

O(1) because:

  • Only three variables are used regardless of input size
  • No additional data structures needed

Advantages and Disadvantages

Advantages

  • Linear time complexity
  • Constant space complexity
  • Simple implementation
  • No recursion overhead
  • Handles large inputs efficiently

Disadvantages

  • Limited by integer overflow for large n
  • Not suitable for calculating specific terms without computing previous ones
  • May need BigInteger for large numbers
  • Cannot easily compute arbitrary terms in sequence

Implementation


class Fibonacci:
    @staticmethod
    def fibonacci_dp(n: int) -> int:
        """
        Calculate the nth Fibonacci number using dynamic programming.
        
        Args:
            n: The position in the Fibonacci sequence (0-based)
            
        Returns:
            The nth Fibonacci number
            
        Raises:
            ValueError: If n is negative
        """
        if n < 0:
            raise ValueError("Fibonacci sequence is not defined for negative numbers")
        
        if n <= 1:
            return n
            
        prev, curr = 0, 1
        
        for _ in range(2, n + 1):
            prev, curr = curr, prev + curr
            
        return curr
    
    @staticmethod
    def fibonacci_sequence(n: int) -> list[int]:
        """
        Generate Fibonacci sequence up to the nth number.
        
        Args:
            n: The position in the Fibonacci sequence (0-based)
            
        Returns:
            List containing the Fibonacci sequence up to n
        """
        if n < 0:
            raise ValueError("Fibonacci sequence is not defined for negative numbers")
            
        sequence = [0]
        if n == 0:
            return sequence
            
        sequence.append(1)
        
        for i in range(2, n + 1):
            sequence.append(sequence[i-1] + sequence[i-2])
            
        return sequence

# Example usage
if __name__ == "__main__":
    # Calculate single Fibonacci number
    n = 10
    result = Fibonacci.fibonacci_dp(n)
    print(f"F({n}) = {result}")
    
    # Generate sequence
    sequence = Fibonacci.fibonacci_sequence(n)
    print(f"Fibonacci sequence up to {n}:")
    print(" ".join(map(str, sequence)))
                                        

#include <iostream>
#include <vector>
#include <stdexcept>

class Fibonacci {
public:
    static long long fibonacciDP(int n) {
        if (n < 0) {
            throw std::invalid_argument("Fibonacci sequence is not defined for negative numbers");
        }
        
        if (n <= 1) {
            return n;
        }
        
        long long prev = 0, curr = 1;
        
        for (int i = 2; i <= n; ++i) {
            long long next = prev + curr;
            prev = curr;
            curr = next;
        }
        
        return curr;
    }
    
    static std::vector<long long> fibonacciSequence(int n) {
        if (n < 0) {
            throw std::invalid_argument("Fibonacci sequence is not defined for negative numbers");
        }
        
        std::vector<long long> sequence;
        sequence.push_back(0);
        
        if (n == 0) {
            return sequence;
        }
        
        sequence.push_back(1);
        
        for (int i = 2; i <= n; ++i) {
            sequence.push_back(sequence[i-1] + sequence[i-2]);
        }
        
        return sequence;
    }
    
    static void printSequence(const std::vector<long long>& sequence) {
        for (size_t i = 0; i < sequence.size(); ++i) {
            std::cout << sequence[i];
            if (i < sequence.size() - 1) {
                std::cout << " ";
            }
        }
        std::cout << std::endl;
    }
};

// Example usage
int main() {
    try {
        int n = 10;
        
        // Calculate single Fibonacci number
        long long result = Fibonacci::fibonacciDP(n);
        std::cout << "F(" << n << ") = " << result << std::endl;
        
        // Generate sequence
        std::cout << "Fibonacci sequence up to " << n << ":" << std::endl;
        auto sequence = Fibonacci::fibonacciSequence(n);
        Fibonacci::printSequence(sequence);
        
    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
        return 1;
    }
    
    return 0;
}
                                        

using System;
using System.Collections.Generic;

public class Fibonacci
{
    public static long FibonacciDP(int n)
    {
        if (n < 0)
        {
            throw new ArgumentException("Fibonacci sequence is not defined for negative numbers");
        }
        
        if (n <= 1)
        {
            return n;
        }
        
        long prev = 0, curr = 1;
        
        for (int i = 2; i <= n; i++)
        {
            long next = prev + curr;
            prev = curr;
            curr = next;
        }
        
        return curr;
    }
    
    public static List<long> FibonacciSequence(int n)
    {
        if (n < 0)
        {
            throw new ArgumentException("Fibonacci sequence is not defined for negative numbers");
        }
        
        var sequence = new List<long> { 0 };
        
        if (n == 0)
        {
            return sequence;
        }
        
        sequence.Add(1);
        
        for (int i = 2; i <= n; i++)
        {
            sequence.Add(sequence[i-1] + sequence[i-2]);
        }
        
        return sequence;
    }
    
    public static void PrintSequence(List<long> sequence)
    {
        Console.WriteLine(string.Join(" ", sequence));
    }
    
    // Example usage
    public static void Main()
    {
        try
        {
            int n = 10;
            
            // Calculate single Fibonacci number
            long result = FibonacciDP(n);
            Console.WriteLine($"F({n}) = {result}");
            
            // Generate sequence
            Console.WriteLine($"Fibonacci sequence up to {n}:");
            var sequence = FibonacciSequence(n);
            PrintSequence(sequence);
        }
        catch (Exception e)
        {
            Console.WriteLine($"Error: {e.Message}");
        }
    }
}