Bird
Raised Fist0
DSA Rustprogramming~5 mins

Recursion Concept and Call Stack Visualization in DSA Rust - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is recursion in programming?
Recursion is when a function calls itself to solve smaller parts of a problem until it reaches a simple case it can solve directly.
Click to reveal answer
beginner
What is a base case in recursion?
A base case is the simplest situation in a recursive function that stops the recursion by returning a direct answer without calling itself again.
Click to reveal answer
intermediate
How does the call stack help in recursion?
The call stack keeps track of all the active function calls. Each recursive call adds a new layer to the stack, and when a base case is reached, the stack unwinds as functions return their results.
Click to reveal answer
beginner
Rust recursive function example: What does this function do? fn factorial(n: u32) -> u32 { if n == 0 { 1 } else { n * factorial(n - 1) } }
This function calculates the factorial of a number n. It multiplies n by the factorial of n-1 until it reaches 0, where it returns 1 as the base case.
Click to reveal answer
intermediate
What happens if a recursive function has no base case?
Without a base case, the recursive calls never stop, causing the program to run forever or crash with a stack overflow error.
Click to reveal answer
What is the purpose of the base case in recursion?
ATo call the function again
BTo stop the recursion and return a simple answer
CTo increase the call stack size
DTo make the function run faster
In Rust, what does this recursive function compute? fn sum(n: u32) -> u32 { if n == 0 { 0 } else { n + sum(n - 1) } }
AFibonacci number at position n
BFactorial of n
CSum of numbers from 1 to n
DProduct of numbers from 1 to n
What does the call stack do during recursion?
ARuns all calls in parallel
BDeletes previous calls immediately
CPrevents recursion from happening
DStores each recursive call until base case is reached
What error occurs if recursion never reaches a base case?
AStack overflow
BSyntax error
CType error
DMemory leak
Which of these is a correct base case for a factorial function?
Aif n == 0 { return 1 }
Bif n == 1 { return 0 }
Cif n > 0 { return n }
Dif n < 0 { return n }
Explain how recursion works using the example of calculating factorial of 3.
Think about how factorial(3) calls factorial(2), then factorial(1), then factorial(0).
You got /4 concepts.
    Describe the role of the call stack in managing recursive function calls.
    Imagine stacking plates; each call adds a plate, and returning removes one.
    You got /4 concepts.

      Practice

      (1/5)
      1. What happens when a recursive function calls itself without a base case?
      easy
      A. The function converts into a loop automatically.
      B. The function returns immediately without doing anything.
      C. The function runs only once and stops.
      D. It causes infinite recursion leading to a stack overflow error.

      Solution

      1. Step 1: Understand recursion base case role

        The base case stops recursion by providing a condition to end calls.
      2. Step 2: Analyze missing base case effect

        Without a base case, the function keeps calling itself endlessly, filling the call stack.
      3. Final Answer:

        It causes infinite recursion leading to a stack overflow error. -> Option D
      4. Quick Check:

        Missing base case = infinite recursion [OK]
      Hint: Always check for a base case to stop recursion [OK]
      Common Mistakes:
      • Thinking recursion stops automatically
      • Assuming function returns without base case
      • Confusing recursion with loops
      2. Which of the following is the correct syntax to define a recursive function in Rust that calculates factorial of a number n?
      easy
      A. fn factorial(n: u32) { if n == 0 { 1 } else { n * factorial(n - 1) } }
      B. fn factorial(n: u32) -> u32 { if n == 0 { 1 } else { n * factorial(n - 1) } }
      C. fn factorial(n: u32) -> u32 { while n > 0 { n * factorial(n - 1) } }
      D. fn factorial(n: u32) -> u32 { return n * factorial(n + 1); }

      Solution

      1. Step 1: Check function return type and base case

        fn factorial(n: u32) -> u32 { if n == 0 { 1 } else { n * factorial(n - 1) } } correctly returns u32 and has base case for n == 0 returning 1.
      2. Step 2: Verify recursive call correctness

        fn factorial(n: u32) -> u32 { if n == 0 { 1 } else { n * factorial(n - 1) } } calls factorial(n - 1) correctly; others miss return type or have wrong logic.
      3. Final Answer:

        fn factorial(n: u32) -> u32 { if n == 0 { 1 } else { n * factorial(n - 1) } } -> Option B
      4. Quick Check:

        Correct syntax = fn factorial(n: u32) -> u32 { if n == 0 { 1 } else { n * factorial(n - 1) } } [OK]
      Hint: Look for base case and correct return type in Rust function [OK]
      Common Mistakes:
      • Omitting return type in function signature
      • Using while loop inside recursive function
      • Calling factorial with n + 1 causing infinite recursion
      3. What is the output of the following Rust code?
      fn print_numbers(n: u32) {
          if n == 0 {
              return;
          }
          print_numbers(n - 1);
          println!("{}", n);
      }
      
      fn main() {
          print_numbers(3);
      }
      medium
      A. 1 2 3
      B. 3 2 1
      C. 3 3 3
      D. 1 1 1

      Solution

      1. Step 1: Trace recursive calls

        print_numbers(3) calls print_numbers(2), then print_numbers(1), then print_numbers(0) which returns immediately.
      2. Step 2: Understand print order after recursion

        After reaching base case, prints happen in reverse call order: prints 1, then 2, then 3.
      3. Final Answer:

        1 2 3 -> Option A
      4. Quick Check:

        Recursion prints after calls = 1 2 3 [OK]
      Hint: Print after recursive call prints in ascending order [OK]
      Common Mistakes:
      • Assuming prints happen before recursive call
      • Confusing order of execution in recursion
      • Ignoring base case effect
      4. Identify the error in this Rust recursive function that calculates the sum of numbers from 1 to n:
      fn sum(n: u32) -> u32 {
          if n == 1 {
              1
          } else {
              n + sum(n + 1)
          }
      }
      medium
      A. The base case condition should be n == 0, not n == 1.
      B. The function lacks a return statement in the else block.
      C. The recursive call uses n + 1 instead of n - 1, causing infinite recursion.
      D. The function should use a loop instead of recursion.

      Solution

      1. Step 1: Analyze recursive call parameter

        The function calls sum(n + 1), which increases n, moving away from base case.
      2. Step 2: Understand effect on recursion

        Since n grows, base case n == 1 is never reached, causing infinite recursion and stack overflow.
      3. Final Answer:

        The recursive call uses n + 1 instead of n - 1, causing infinite recursion. -> Option C
      4. Quick Check:

        Recursive call must reduce n to reach base case [OK]
      Hint: Recursive calls should move toward base case by decreasing n [OK]
      Common Mistakes:
      • Using n + 1 instead of n - 1 in recursion
      • Confusing base case condition
      • Missing return keyword in else block
      5. Given the following Rust recursive function that reverses a string slice, what will be the output of reverse("rust")?
      fn reverse(s: &str) -> String {
          if s.is_empty() {
              String::new()
          } else {
              let (first, rest) = s.split_at(1);
              format!("{}{}", reverse(rest), first)
          }
      }
      
      fn main() {
          println!("{}", reverse("rust"));
      }
      hard
      A. "tsur"
      B. "rust"
      C. "trus"
      D. "rustt"

      Solution

      1. Step 1: Understand recursion and string splitting

        The function splits the string into first character and rest, then recursively reverses rest and appends first.
      2. Step 2: Trace calls for "rust"

        reverse("rust") calls reverse("ust") + "r", reverse("ust") calls reverse("st") + "u", and so on, building reversed string "tsur".
      3. Final Answer:

        "tsur" -> Option A
      4. Quick Check:

        Recursive reverse builds string backwards = "tsur" [OK]
      Hint: Recursive reverse appends first char after reversing rest [OK]
      Common Mistakes:
      • Confusing order of concatenation
      • Not handling empty string base case
      • Assuming original string is returned
      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