Recursion on Arrays and Strings in DSA C# - Time & Space Complexity
When using recursion on arrays or strings, we want to know how the number of steps grows as the input gets bigger.
We ask: How many times does the function call itself and how much work does it do each time?
Analyze the time complexity of the following code snippet.
public int SumArray(int[] arr, int index)
{
if (index == arr.Length) return 0;
return arr[index] + SumArray(arr, index + 1);
}
This code sums all elements in an array by calling itself for each index until it reaches the end.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive call to SumArray for each index.
- How many times: Once per element in the array, so n times for array length n.
Each element causes one recursive call doing a simple addition.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 additions and 10 calls |
| 100 | About 100 additions and 100 calls |
| 1000 | About 1000 additions and 1000 calls |
Pattern observation: The work grows directly with the size of the array, increasing steadily.
Time Complexity: O(n)
This means the time to complete grows in a straight line with the number of elements.
[X] Wrong: "Recursion always makes the code slower and more complex than loops."
[OK] Correct: Recursion here simply replaces a loop and does the same amount of work, so time complexity stays the same.
Understanding recursion time helps you explain your code clearly and shows you know how your solution scales with input size.
"What if the recursion called itself twice per step (like in a binary tree)? How would the time complexity change?"
Practice
Solution
Step 1: Understand recursion concept
Recursion solves problems by calling itself with smaller inputs until a simple base case is reached.Step 2: Apply to arrays or strings
For arrays or strings, recursion processes one element and then calls itself on the rest.Final Answer:
Breaking the problem into smaller similar problems until a base case is reached -> Option CQuick Check:
Recursion = divide and conquer [OK]
- Confusing recursion with loops
- Ignoring the base case
- Trying to process all elements at once
Solution
Step 1: Identify base case for string recursion
The base case should stop recursion when the string is empty (length zero).Step 2: Check options
if (str.Length == 0) return; correctly checks if string length is zero to stop recursion.Final Answer:
if (str.Length == 0) return; -> Option DQuick Check:
Base case = empty string check [OK]
- Checking for null instead of empty string
- Using wrong condition like length > 0
- Checking for null character '\0' in C# strings
static int SumArray(int[] arr, int index) {
if (index == arr.Length) return 0;
return arr[index] + SumArray(arr, index + 1);
}
int[] nums = {1, 2, 3};
Console.WriteLine(SumArray(nums, 0));Solution
Step 1: Trace recursive calls
SumArray called with index 0 returns arr[0] + SumArray(1) = 1 + ... SumArray(1) returns 2 + SumArray(2) SumArray(2) returns 3 + SumArray(3) SumArray(3) returns 0 (base case)Step 2: Calculate total sum
Sum = 1 + 2 + 3 + 0 = 6Final Answer:
6 -> Option AQuick Check:
Sum of [1,2,3] = 6 [OK]
- Forgetting base case leads to infinite recursion
- Returning wrong index or value
- Confusing index with length
static string Reverse(string s) {
if (s.Length == 0) return s;
return Reverse(s.Substring(1)) + s[0];
}
// Usage: Console.WriteLine(Reverse(null));Solution
Step 1: Analyze input null handling
The function calls s.Length but if s is null, this causes NullReferenceException.Step 2: Check base case and usage
Base case is correct for empty string but does not handle null input, causing runtime error.Final Answer:
It causes a NullReferenceException when input is null -> Option AQuick Check:
Null input causes exception [OK]
- Not checking for null input
- Assuming empty string and null are same
- Ignoring exceptions from null dereference
Solution
Step 1: Understand palindrome check logic
Palindrome means first and last characters match, and inner substring is also palindrome.Step 2: Apply recursion
Recursively check first and last chars, then call function on substring excluding them until base case (empty or single char).Final Answer:
Check if first and last characters are equal, then recurse on substring excluding them -> Option BQuick Check:
Palindrome check = compare ends + recurse [OK]
- Reversing string is less efficient
- Counting characters doesn't prove palindrome
- Sorting changes string order
Ready to prove it?
Pass the test and this pattern moves unknown
