Recursion on Arrays and Strings in DSA Go - 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 number of these calls grows as the input gets bigger.
Analyze the time complexity of the following code snippet.
func sumArray(arr []int, n int) int {
if n == 0 {
return 0
}
return sumArray(arr, n-1) + arr[n-1]
}
This function adds all elements of an array by calling itself with one less element each time.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive call reducing the problem size by one element.
- How many times: Exactly n times, once for each element in the array.
Each time the function calls itself, it processes one less element until none remain.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 recursive calls |
| 100 | 100 recursive calls |
| 1000 | 1000 recursive calls |
Pattern observation: The number of calls grows directly with the size of the input.
Time Complexity: O(n)
This means the time to complete grows linearly with the number of elements.
[X] Wrong: "Recursion will always be slower than loops because it repeats work unnecessarily."
[OK] Correct: Here, recursion processes each element exactly once, just like a loop would, so the time is the same order.
Understanding how recursion scales helps you explain your solutions 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 processes an array by calling itself with a smaller portion, usually by reducing the size or moving the index.Step 2: Identify the base case
The recursion stops when the array is empty or the index reaches the end, preventing infinite calls.Final Answer:
It calls itself with a smaller part of the array until a base case is reached -> Option DQuick Check:
Recursion = smaller calls until base case [OK]
- Thinking recursion loops without reducing problem size
- Ignoring the base case leading to infinite recursion
- Confusing recursion with iteration
Solution
Step 1: Check function signature and base case
func recurse(s string) string { if len(s) == 0 { return "" } return string(s[0]) + recurse(s[1:]) } defines a function with a base case checking if string length is zero, returning empty string.Step 2: Confirm recursive call reduces problem size
func recurse(s string) string { if len(s) == 0 { return "" } return string(s[0]) + recurse(s[1:]) } calls itself with substring s[1:], reducing string size each call, correctly building result.Final Answer:
func recurse(s string) string { if len(s) == 0 { return "" } return string(s[0]) + recurse(s[1:]) } -> Option AQuick Check:
Base case + smaller input = correct recursion [OK]
- Missing base case causing infinite recursion
- Not reducing string size in recursive call
- Incorrect return types or missing return
package main
import "fmt"
func sum(arr []int) int {
if len(arr) == 0 {
return 0
}
return arr[0] + sum(arr[1:])
}
func main() {
result := sum([]int{1, 2, 3, 4})
fmt.Println(result)
}Solution
Step 1: Understand the recursive sum function
The function sums the first element and calls itself with the rest of the array until empty.Step 2: Calculate sum step-by-step
sum([1,2,3,4]) = 1 + sum([2,3,4]) = 1 + 2 + sum([3,4]) = 1 + 2 + 3 + sum([4]) = 1 + 2 + 3 + 4 + sum([]) = 10Final Answer:
10 -> Option AQuick Check:
Sum of 1+2+3+4 = 10 [OK]
- Confusing concatenation with addition
- Forgetting base case returns 0
- Misreading slice syntax arr[1:]
package main
import "fmt"
func reverse(s string) string {
if len(s) == 0 {
return ""
}
return reverse(s[1:]) + s[0]
}
func main() {
fmt.Println(reverse(123))
}Solution
Step 1: Check function call in main
The function reverse expects a string, but main calls reverse(123), an integer, causing a type error.Step 2: Confirm recursion and base case are correct
The function has a proper base case and reduces string size correctly, so no recursion error.Final Answer:
Passing an integer instead of a string to reverse -> Option BQuick Check:
Type mismatch in function argument [OK]
- Ignoring type mismatch errors
- Assuming recursion error without checking call
- Confusing string indexing with integer
Solution
Step 1: Understand recursive vowel removal
The function should check the first character, decide to keep or skip it, then recurse on the rest of the string.Step 2: Confirm recursion reduces problem size and builds result
By slicing the string smaller each call and concatenating results, recursion correctly removes vowels.Final Answer:
Check first character; if vowel, skip and recurse on rest; else include and recurse -> Option CQuick Check:
Recursion with condition + smaller input = correct approach [OK]
- Not reducing string size causing infinite recursion
- Using loops instead of recursion
- Ignoring condition to skip vowels
Ready to prove it?
Pass the test and this pattern moves unknown
