Recursion on Arrays and Strings in DSA C++ - Time & Space Complexity
When we use recursion on arrays or strings, we call the same function repeatedly on smaller parts.
We want to know how the total work grows as the input size grows.
Analyze the time complexity of the following code snippet.
int sumArray(int arr[], int n) {
if (n == 0) return 0;
return arr[n - 1] + sumArray(arr, n - 1);
}
This function calculates the sum of all elements in the array using recursion.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive call reducing array size by 1 each time.
- How many times: Exactly n times, once for each element.
Each recursive call does a small fixed amount of work plus calls itself on a smaller array.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 calls |
| 100 | About 100 calls |
| 1000 | About 1000 calls |
Pattern observation: The work grows directly with input size; doubling input doubles work.
Time Complexity: O(n)
This means the time to complete grows in a straight line with the size of the array.
[X] Wrong: "Recursion here is faster because it skips some elements."
[OK] Correct: Each element is still processed once, so recursion does not skip work; it just organizes it differently.
Understanding recursion time helps you explain your code clearly and choose the best approach in interviews.
"What if the recursion called itself twice each time, like in a binary tree traversal? How would the time complexity change?"
Practice
Solution
Step 1: Understand recursion on arrays
A recursive function on an array usually handles one element and then calls itself on the remaining elements.Step 2: Compare options
It processes one element and calls itself on the rest of the array matches this behavior. Options A, C, and D describe non-recursive or incorrect methods.Final Answer:
It processes one element and calls itself on the rest of the array -> Option AQuick Check:
Recursion on arrays = process one element + recurse [OK]
- Thinking recursion processes all elements at once
- Confusing recursion with loops
- Assuming recursion only processes last element
arr of size n?Solution
Step 1: Identify base case for recursion on array size
The base case should stop recursion when no elements are left, which is when n == 0.Step 2: Check each option
if (n == 0) return 0; returns 0 when n == 0, which is correct. if (n == 1) return arr[1]; incorrectly accesses arr[1] instead of arr[0]. if (arr == NULL) return 0; checks pointer but not size. if (n < 0) return 0; uses invalid negative size.Final Answer:
if (n == 0) return 0; -> Option AQuick Check:
Base case for empty array = return 0 [OK]
- Using wrong index in base case
- Checking pointer instead of size
- Allowing negative sizes
int sumArray(int arr[], int n) {
if (n == 0) return 0;
return arr[n-1] + sumArray(arr, n-1);
}
int main() {
int arr[] = {1, 2, 3, 4};
int result = sumArray(arr, 4);
std::cout << result;
return 0;
}Solution
Step 1: Trace recursive calls
sumArray(arr,4) = arr[3] + sumArray(arr,3) = 4 + sumArray(arr,3) sumArray(arr,3) = arr[2] + sumArray(arr,2) = 3 + sumArray(arr,2) sumArray(arr,2) = arr[1] + sumArray(arr,1) = 2 + sumArray(arr,1) sumArray(arr,1) = arr[0] + sumArray(arr,0) = 1 + 0 = 1Step 2: Calculate total sum
Total = 4 + 3 + 2 + 1 = 10Final Answer:
10 -> Option DQuick Check:
Sum of {1,2,3,4} = 10 [OK]
- Confusing index n-1 with n
- Forgetting base case returns 0
- Assuming sum is product
c in string s:int countChar(string s, char c, int index) {
if (index == s.length()) return 0;
if (s[index] == c) return 1 + countChar(s, c, index++);
else return countChar(s, c, index++);
}Solution
Step 1: Analyze recursive calls with index++
Using index++ passes the current index value before increment, so recursive call uses same index repeatedly.Step 2: Identify infinite recursion cause
Because index does not increase in recursive calls, base case is never reached, causing infinite recursion.Final Answer:
Using post-increment (index++) causes infinite recursion -> Option CQuick Check:
Post-increment in recursion argument = infinite loop [OK]
- Using post-increment in recursive call argument
- Ignoring base case correctness
- Confusing return types
s, write a recursive function to check if it is a palindrome (reads same forward and backward). Which approach below correctly implements this?Solution
Step 1: Understand palindrome check recursively
To check palindrome recursively, compare first and last characters; if they match, recurse on substring excluding them.Step 2: Evaluate options
Check if first and last chars match, then recurse on substring excluding them matches this logic. Reverse string using loop and compare with original uses loops, not recursion. Options C and D do not correctly check palindrome property.Final Answer:
Check if first and last chars match, then recurse on substring excluding them -> Option BQuick Check:
Palindrome recursion = compare ends + recurse inside [OK]
- Using loops instead of recursion
- Only checking one side of string
- Counting chars instead of comparing
Ready to prove it?
Pass the test and this pattern moves unknown
