Bird
Raised Fist0
DSA Rustprogramming~5 mins

Recursion on Arrays and Strings in DSA Rust - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is recursion in the context of arrays and strings?
Recursion is a method where a function calls itself to solve smaller parts of a problem, like processing one element of an array or one character of a string at a time until it reaches the end.
Click to reveal answer
beginner
How do you identify the base case in a recursive function for arrays?
The base case is when the function reaches the end of the array, usually when the index is equal to the array's length, stopping further recursive calls.
Click to reveal answer
beginner
Explain the role of the recursive call in processing a string character by character.
The recursive call processes the current character and then calls itself with the next character's position, moving step-by-step through the string until the base case is reached.
Click to reveal answer
intermediate
What happens if a recursive function on an array does not have a proper base case?
Without a proper base case, the function will keep calling itself indefinitely, causing a stack overflow error and crashing the program.
Click to reveal answer
intermediate
In Rust, why is it important to pass array slices or string slices in recursive functions instead of whole arrays or strings?
Passing slices allows the function to work on smaller parts without copying the entire data, making recursion efficient and safe by borrowing parts of the array or string.
Click to reveal answer
What is the base case for a recursive function processing an array of length n?
AWhen the index is 0
BWhen the array is empty
CWhen the index reaches n
DWhen the array has one element
In recursion on strings, what does the recursive call usually do?
AProcesses the string backwards only
BProcesses the entire string at once
CCalls itself without changing the string
DProcesses the current character and calls itself with the next character
What error occurs if recursion has no base case?
ASyntax error
BStack overflow
CType error
DRuntime warning
Why use slices in Rust recursion on arrays or strings?
ATo avoid copying data and improve efficiency
BTo copy the entire array each time
CTo convert arrays to strings
DTo increase memory usage
Which of these is NOT a typical step in recursive processing of an array?
ALoop through array with for-loop
BMake recursive call with next index
CStop when index equals array length
DProcess current element
Describe how recursion works when processing an array step-by-step.
Think about how you handle one element at a time until done.
You got /4 concepts.
    Explain why base cases are crucial in recursive functions on strings.
    Without base cases, recursion never ends.
    You got /4 concepts.

      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