Bird
Raised Fist0
DSA Rustprogramming~5 mins

Fibonacci Using Recursion in DSA Rust - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Fibonacci Using Recursion
O(2^n)
Understanding Time Complexity

We want to understand how the time needed to find a Fibonacci number grows as the input number gets bigger.

How does the number of steps change when we use recursion to find Fibonacci numbers?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.

fn fibonacci(n: u32) -> u32 {
    if n == 0 || n == 1 {
        return n;
    }
    fibonacci(n - 1) + fibonacci(n - 2)
}

This code calculates the nth Fibonacci number by calling itself twice for smaller numbers until it reaches 0 or 1.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Recursive calls to fibonacci for n-1 and n-2.
  • How many times: Each call splits into two more calls until base cases (0 or 1) are reached.
How Execution Grows With Input

Each number requires calculating two smaller Fibonacci numbers, causing the number of calls to grow very fast.

Input Size (n)Approx. Operations
10About 177 calls
20About 21,891 calls
30About 2,692,537 calls

Pattern observation: The number of calls roughly doubles with each increase in n, growing exponentially.

Final Time Complexity

Time Complexity: O(2^n)

This means the time needed grows very fast, doubling with each step up in n, making it slow for large numbers.

Common Mistake

[X] Wrong: "The recursive Fibonacci runs in linear time because it just counts down from n to 0."

[OK] Correct: Each call makes two more calls, so the total calls grow much faster than just counting down.

Interview Connect

Understanding this helps you explain why simple recursion can be slow and why techniques like memoization improve performance.

Self-Check

"What if we add a memory to store results (memoization)? How would the time complexity change?"

Practice

(1/5)
1. What does the Fibonacci sequence represent when calculated using recursion?
easy
A. Each number is the square of the previous number
B. Each number is the product of the two preceding numbers
C. Each number is the difference of the two preceding numbers
D. Each number is the sum of the two preceding numbers

Solution

  1. Step 1: Understand Fibonacci sequence definition

    The Fibonacci sequence is defined such that each number is the sum of the two numbers before it.
  2. Step 2: Relate to recursion

    Recursion calls the function for the two previous numbers and adds their results.
  3. Final Answer:

    Each number is the sum of the two preceding numbers -> Option D
  4. Quick Check:

    Fibonacci = sum of two previous numbers [OK]
Hint: Fibonacci adds last two numbers, not multiply or subtract [OK]
Common Mistakes:
  • Thinking Fibonacci multiplies previous numbers
  • Confusing subtraction or division with addition
  • Assuming Fibonacci squares previous number
2. Which of the following is the correct Rust function signature for a recursive Fibonacci function?
easy
A. fn fibonacci(n: i32) -> i32
B. fn fibonacci(n) -> i32
C. fn fibonacci(n: i32)
D. fn fibonacci(n: i32) -> void

Solution

  1. Step 1: Check Rust function signature syntax

    Rust requires parameter types and return type specified, e.g., fn name(param: type) -> return_type.
  2. Step 2: Match correct signature for Fibonacci

    Fibonacci takes an integer and returns an integer, so fn fibonacci(n: i32) -> i32 is correct.
  3. Final Answer:

    fn fibonacci(n: i32) -> i32 -> Option A
  4. Quick Check:

    Rust needs types and return type [OK]
Hint: Rust functions need parameter and return types declared [OK]
Common Mistakes:
  • Omitting parameter type
  • Missing return type
  • Using void instead of () or proper return type
3. What is the output of this Rust code?
fn fibonacci(n: i32) -> i32 {
    if n <= 1 {
        n
    } else {
        fibonacci(n - 1) + fibonacci(n - 2)
    }
}

fn main() {
    println!("{}", fibonacci(5));
}
medium
A. 3
B. 5
C. 8
D. 13

Solution

  1. Step 1: Trace fibonacci(5) calls

    fibonacci(5) = fibonacci(4) + fibonacci(3). Breaking down recursively, fibonacci(5) = 5.
  2. Step 2: Confirm base cases and sums

    Base cases: fibonacci(0)=0, fibonacci(1)=1. Summing up gives fibonacci(5) = 5.
  3. Final Answer:

    5 -> Option B
  4. Quick Check:

    Fibonacci(5) = 5 [OK]
Hint: Remember fibonacci(5) = 5 from sequence 0,1,1,2,3,5 [OK]
Common Mistakes:
  • Confusing fibonacci(5) with fibonacci(6)
  • Miscounting base cases
  • Adding wrong recursive results
4. Identify the error in this Rust recursive Fibonacci function:
fn fibonacci(n: i32) -> i32 {
    if n == 0 {
        0
    } else if n == 1 {
        1
    } else {
        fibonacci(n - 1) - fibonacci(n - 2)
    }
}
medium
A. The base cases are incorrect
B. The function will cause infinite recursion
C. The recursive step uses subtraction instead of addition
D. The function lacks a return type

Solution

  1. Step 1: Check base cases

    Base cases for n=0 and n=1 return 0 and 1 correctly.
  2. Step 2: Analyze recursive step

    The recursive step uses subtraction (fibonacci(n - 1) - fibonacci(n - 2)) instead of addition, which is incorrect for Fibonacci.
  3. Final Answer:

    The recursive step uses subtraction instead of addition -> Option C
  4. Quick Check:

    Fibonacci sums previous two, not subtracts [OK]
Hint: Fibonacci recursion adds two previous calls, not subtracts [OK]
Common Mistakes:
  • Using subtraction in recursive step
  • Forgetting to return values
  • Incorrect base case values
5. How can you optimize the recursive Fibonacci function in Rust to avoid repeated calculations?
hard
A. Use memoization to store and reuse computed results
B. Increase the recursion depth limit
C. Use a loop instead of recursion
D. Call the function with negative numbers

Solution

  1. Step 1: Understand recursion inefficiency

    Recursive Fibonacci recalculates the same values many times, causing slow performance.
  2. Step 2: Apply memoization

    Memoization stores results of previous calls in a cache to reuse, avoiding repeated work.
  3. Final Answer:

    Use memoization to store and reuse computed results -> Option A
  4. Quick Check:

    Memoization optimizes recursion by caching [OK]
Hint: Cache results to speed up recursive Fibonacci [OK]
Common Mistakes:
  • Increasing recursion depth doesn't fix repeated work
  • Using loops changes approach, not recursion optimization
  • Calling with negative numbers causes errors
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard