Recursion Base Case and Recursive Case in DSA Go - Time & Space Complexity
We want to understand how the time taken by a recursive function grows as the input size changes.
Specifically, we ask: How many times does the function call itself before stopping?
Analyze the time complexity of the following code snippet.
package main
func factorial(n int) int {
if n == 0 {
return 1
}
return n * factorial(n-1)
}
This code calculates the factorial of a number using recursion with a base case and a recursive case.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The function calls itself with a smaller number (n-1).
- How many times: It repeats until n reaches 0, so it calls itself n times.
Each time the function calls itself, it does one multiplication and one smaller call.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 multiplications and calls |
| 100 | About 100 multiplications and calls |
| 1000 | About 1000 multiplications and calls |
Pattern observation: The number of operations grows directly with n; doubling n doubles the work.
Time Complexity: O(n)
This means the time taken grows linearly with the input size n.
[X] Wrong: "Recursion always makes the program slow and complex exponentially."
[OK] Correct: In this case, recursion runs a simple chain of calls, so it grows linearly, not exponentially.
Understanding how base and recursive cases affect time helps you explain recursion clearly and analyze its efficiency in interviews.
"What if the recursive call was made twice in the function? How would the time complexity change?"
Practice
base case in a recursive function?Solution
Step 1: Understand recursion basics
A recursive function calls itself repeatedly until a stopping condition is met.Step 2: Identify the role of base case
The base case stops further recursive calls to avoid infinite loops.Final Answer:
To stop the recursion and prevent infinite calls -> Option DQuick Check:
Base case = stop recursion [OK]
- Confusing base case with recursive case
- Thinking base case calls function again
- Ignoring base case leads to infinite recursion
n is zero?Solution
Step 1: Check Go syntax for condition
In Go, equality check uses '==' not '=' which is assignment.Step 2: Identify correct base case condition
Base case stops recursion when n equals zero, so 'if n == 0 { return 0 }' is correct.Final Answer:
if n == 0 { return 0 } -> Option AQuick Check:
Use '==' for comparison in base case [OK]
- Using '=' instead of '==' for comparison
- Wrong condition logic for base case
- Returning wrong value in base case
factorial(3)?
func factorial(n int) int {
if n == 0 {
return 1
}
return n * factorial(n - 1)
}Solution
Step 1: Trace recursive calls for factorial(3)
factorial(3) = 3 * factorial(2) factorial(2) = 2 * factorial(1) factorial(1) = 1 * factorial(0) factorial(0) = 1 (base case)Step 2: Calculate return values step-by-step
factorial(1) = 1 * 1 = 1 factorial(2) = 2 * 1 = 2 factorial(3) = 3 * 2 = 6Final Answer:
6 -> Option AQuick Check:
3! = 6 [OK]
- Forgetting base case returns 1
- Multiplying incorrectly in recursive step
- Confusing factorial with addition
func sum(n int) int {
if n == 1 {
return 1
}
return n + sum(n)
}Solution
Step 1: Analyze recursive call argument
The function calls sum(n) again without reducing n, so it never reaches base case.Step 2: Identify infinite recursion cause
Recursive call must use sum(n-1) to reduce n and eventually stop at base case.Final Answer:
Recursive call does not reduce n, causing infinite recursion -> Option CQuick Check:
Recursive argument must decrease to reach base case [OK]
- Calling recursion with same argument
- Wrong base case value
- Misplacing return statement
reverse("go")?
func reverse(s string) string {
if len(s) == 0 {
return ""
}
return reverse(s[1:]) + string(s[0])
}Solution
Step 1: Trace recursive calls for reverse("go")
reverse("go") calls reverse("o") + "g" reverse("o") calls reverse("") + "o" reverse("") returns "" (base case)Step 2: Combine return values step-by-step
reverse("") = "" reverse("o") = "" + "o" = "o" reverse("go") = "o" + "g" = "og"Final Answer:
"og" -> Option BQuick Check:
String reversed = "og" [OK]
- Confusing substring slicing
- Forgetting base case returns empty string
- Concatenating in wrong order
Ready to prove it?
Pass the test and this pattern moves unknown
