Bird
Raised Fist0
DSA Rustprogramming~30 mins

Recursion Concept and Call Stack Visualization in DSA Rust - Build from Scratch

Choose your learning style10 modes available
Recursion Concept and Call Stack Visualization
📖 Scenario: Imagine you are stacking boxes one on top of another. To find out how many boxes are stacked, you can count them one by one from the top to the bottom. Recursion works similarly by breaking a problem into smaller parts and solving each part step-by-step.
🎯 Goal: You will build a simple recursive function in Rust that counts down from a given number to 1, printing each step. This will help you see how recursion calls itself and how the call stack grows and shrinks.
📋 What You'll Learn
Create a recursive function called count_down that takes an integer parameter n.
Use a base case to stop recursion when n is 0.
Print the current value of n in each recursive call.
Call count_down starting from 5.
Print the final message "Done!" after recursion finishes.
💡 Why This Matters
🌍 Real World
Recursion is used in many real-world problems like searching files in folders, solving puzzles, and processing tree structures.
💼 Career
Understanding recursion helps in software development roles that involve algorithms, data structures, and problem-solving.
Progress0 / 4 steps
1
Create the starting point variable
Create a variable called start and set it to 5.
DSA Rust
Hint

Use let start = 5; inside the main function.

2
Define the recursive function
Define a function called count_down that takes an integer parameter n. Inside it, write an if statement that stops recursion when n == 0. Otherwise, print n and call count_down(n - 1).
DSA Rust
Hint

Use fn count_down(n: i32) and inside it check if n == 0 to stop. Print n and call count_down(n - 1) recursively.

3
Call the recursive function
Inside the main function, call count_down with the variable start.
DSA Rust
Hint

Call the function by writing count_down(start); inside main.

4
Print completion message
After calling count_down(start) in main, print "Done!" to show recursion finished.
DSA Rust
Hint

Use println!("Done!"); after the recursive call in main.

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