Bird
Raised Fist0
DSA Rustprogramming~10 mins

Recursion on Arrays and Strings in DSA Rust - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to recursively sum all elements in the array.

DSA Rust
fn sum_array(arr: &[i32], index: usize) -> i32 {
    if index == arr.len() {
        return 0;
    }
    arr[index] + [1](arr, index + 1)
}
Drag options to blanks, or click blank then click option'
Asum_array
Bsum
Carray_sum
DsumArr
Attempts:
3 left
💡 Hint
Common Mistakes
Using a wrong function name causes a compile error.
Forgetting to increment the index leads to infinite recursion.
2fill in blank
medium

Complete the code to check if a string is a palindrome using recursion.

DSA Rust
fn is_palindrome(s: &str) -> bool {
    if s.len() <= 1 {
        return true;
    }
    let bytes = s.as_bytes();
    if bytes[0] != bytes[s.len() - 1] {
        return false;
    }
    is_palindrome(&s[1..[1]])
}
Drag options to blanks, or click blank then click option'
As.len() - 3
Bs.len()
Cs.len() - 1
Ds.len() - 2
Attempts:
3 left
💡 Hint
Common Mistakes
Using s.len() includes the last character again causing infinite recursion.
Using s.len() - 2 removes too many characters.
3fill in blank
hard

Fix the error in the recursive function that counts occurrences of a target in an array.

DSA Rust
fn count_occurrences(arr: &[i32], target: i32, index: usize) -> i32 {
    if index == arr.len() {
        return 0;
    }
    let count = if arr[index] == target { 1 } else { 0 };
    count + [1](arr, target, index + 1)
}
Drag options to blanks, or click blank then click option'
Acount_occurrences
BcountOccurrence
Ccount_occur
Doccurrences_count
Attempts:
3 left
💡 Hint
Common Mistakes
Using a different function name causes a compile error.
Forgetting to increment index causes infinite recursion.
4fill in blank
hard

Fill both blanks to recursively reverse a string slice.

DSA Rust
fn reverse_string(s: &str) -> String {
    if s.is_empty() {
        return String::new();
    }
    let last_char = &s[s.len() - 1..s.len()];
    let rest = &s[0..[1]];
    format!("{}{}", last_char, [2](rest))
}
Drag options to blanks, or click blank then click option'
As.len() - 1
Bs.len()
Creverse_string
Dreverse
Attempts:
3 left
💡 Hint
Common Mistakes
Using s.len() includes the last character again causing incorrect slicing.
Using wrong function name causes compile error.
5fill in blank
hard

Fill the blanks to build a dictionary of word lengths for words longer than 3 characters.

DSA Rust
fn word_lengths(words: &[&str]) -> std::collections::HashMap<String, usize> {
    let mut map = std::collections::HashMap::new();
    for &word in words {
        if word.len() > 3 {
            map.insert([1].to_string(), [2]);
        }
    }
    map
}

// Usage example:
// let words = ["apple", "bat", "carrot"];
// let result = word_lengths(&words);
Drag options to blanks, or click blank then click option'
Aword
Bword.len()
Attempts:
3 left
💡 Hint
Common Mistakes
Using the wrong variable for key or value.
Not converting the word to a string for the key.

Practice

(1/5)
1. What does recursion on arrays typically involve when processing elements?
easy
A. Using loops to iterate over the array elements
B. Calling the same function with a smaller part of the array until a base case is reached
C. Sorting the array before processing
D. Creating a new array for each element

Solution

  1. Step 1: Understand recursion on arrays

    Recursion on arrays means the function calls itself with a smaller portion of the array each time.
  2. Step 2: Identify the base case

    The recursion stops when the array is empty or has one element (base case).
  3. Final Answer:

    Calling the same function with a smaller part of the array until a base case is reached -> Option B
  4. Quick Check:

    Recursion = smaller input calls [OK]
Hint: Recursion breaks problem into smaller parts until simple case [OK]
Common Mistakes:
  • Confusing recursion with loops
  • Not defining a base case
  • Trying to process the whole array at once
2. Which of the following is the correct Rust function signature for a recursive function that takes a slice of integers?
easy
A. fn recurse(arr: &mut [i32]) -> i32
B. fn recurse(arr: Vec<i32>) -> i32
C. fn recurse(arr: i32) -> &[i32]
D. fn recurse(arr: &[i32]) -> i32

Solution

  1. Step 1: Understand Rust slice parameter

    A recursive function processing an array usually takes a slice reference like &[i32] to avoid ownership issues.
  2. Step 2: Check return type

    Returning i32 is common if the function calculates a value like sum or count.
  3. Final Answer:

    fn recurse(arr: &[i32]) -> i32 -> Option D
  4. Quick Check:

    Slice input with reference = fn recurse(arr: &[i32]) -> i32 [OK]
Hint: Use &[i32] for read-only array slices in recursion [OK]
Common Mistakes:
  • Using Vec<i32> causes ownership moves
  • Returning a reference to local data
  • Using mutable slice when not needed
3. What is the output of this Rust recursive function when called with arr = &[1, 2, 3]?
fn sum(arr: &[i32]) -> i32 {
    if arr.is_empty() {
        0
    } else {
        arr[0] + sum(&arr[1..])
    }
}

println!("{}", sum(arr));
medium
A. 0
B. 3
C. 6
D. Compilation error

Solution

  1. Step 1: Trace recursive calls

    sum(&[1,2,3]) = 1 + sum(&[2,3]) sum(&[2,3]) = 2 + sum(&[3]) sum(&[3]) = 3 + sum(&[]) sum(&[]) = 0 (base case)
  2. Step 2: Calculate total sum

    sum = 1 + 2 + 3 + 0 = 6
  3. Final Answer:

    6 -> Option C
  4. Quick Check:

    1+2+3 = 6 [OK]
Hint: Sum adds first element plus recursive sum of rest [OK]
Common Mistakes:
  • Forgetting base case returns 0
  • Adding wrong slice range
  • Confusing output with length
4. Identify the error in this recursive Rust function that tries to count occurrences of a number in an array:
fn count_occurrences(arr: &[i32], target: i32) -> i32 {
    if arr.len() == 0 {
        0
    } else if arr[0] == target {
        1 + count_occurrences(&arr[1..], target)
    } else {
        count_occurrences(arr, target)
    }
}
medium
A. Infinite recursion because the else branch calls with the same array slice
B. Missing base case for empty array
C. Incorrect comparison operator in if condition
D. Function should return bool instead of i32

Solution

  1. Step 1: Analyze recursive calls

    In the else branch, the function calls itself with the same array slice, causing infinite recursion.
  2. Step 2: Identify fix

    The else branch should call with &arr[1..] to move forward and avoid infinite loop.
  3. Final Answer:

    Infinite recursion because the else branch calls with the same array slice -> Option A
  4. Quick Check:

    Same slice call causes infinite recursion [OK]
Hint: Always reduce array size in recursive calls to avoid infinite loops [OK]
Common Mistakes:
  • Not reducing slice in else branch
  • Confusing base case condition
  • Returning wrong type
5. Given a string slice s: &str, which recursive Rust function correctly reverses the string?
hard
A. fn reverse(s: &str) -> String { if s.len() == 0 { String::new() } else { format!("{}{}", reverse(&s[1..]), &s[0..1]) } }
B. fn reverse(s: &str) -> String { if s.len() == 1 { s.to_string() } else { format!("{}{}", &s[0..1], reverse(&s[1..])) } }
C. fn reverse(s: &str) -> String { if s.is_empty() { String::new() } else { format!("{}{}", &s[0..1], reverse(&s[1..])) } }
D. } } ))]..1[s&(esrever ,]1..0[s& ,"}{}{"(!tamrof { esle } )(wen::gnirtS { )(ytpme_si.s fi { gnirtS >- )rts& :s(esrever nf

Solution

  1. Step 1: Understand string slicing and recursion

    To reverse, recursively reverse substring from index 1 onward, then append first character.
  2. Step 2: Check base case and concatenation order

    Base case is empty string returning empty String. Concatenate reversed tail + first char.
  3. Step 3: Compare options

    fn reverse(s: &str) -> String { if s.len() == 0 { String::new() } else { format!("{}{}", reverse(&s[1..]), &s[0..1]) } } matches correct base case and concatenation order.
  4. Final Answer:

    fn reverse(s: &str) -> String { if s.len() == 0 { String::new() } else { format!("{}{}", reverse(&s[1..]), &s[0..1]) } } -> Option A
  5. Quick Check:

    Reverse tail + first char = correct recursion [OK]
Hint: Reverse substring then add first char at end for string reversal [OK]
Common Mistakes:
  • Appending first char before recursive call
  • Wrong base case condition
  • Using incorrect string slices
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