Recursion Concept and Call Stack Visualization in DSA Javascript - Time & Space Complexity
When using recursion, we want to know how many times the function calls itself as the input grows.
We ask: How does the work increase when the input gets bigger?
Analyze the time complexity of the following recursive function.
function factorial(n) {
if (n === 0) return 1;
return n * factorial(n - 1);
}
This function calculates the factorial of a number by calling itself with smaller values until it reaches zero.
Look for repeated calls or loops.
- Primary operation: Recursive call to factorial with n - 1
- How many times: Exactly n times until reaching 0
Each time we call factorial, it calls itself once with a smaller number until zero.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 11 calls |
| 100 | 101 calls |
| 1000 | 1001 calls |
Pattern observation: The number of calls grows directly with n, so doubling n doubles the calls.
Time Complexity: O(n)
This means the function does work proportional to the input size, calling itself once per number down to zero.
[X] Wrong: "Recursion always makes the program slow because it repeats work many times."
[OK] Correct: In this case, each call is unique and happens once, so the work grows linearly, not exponentially.
Understanding how recursion grows helps you explain your code clearly and shows you can reason about performance, a key skill in interviews.
"What if the function called itself twice each time (like in Fibonacci)? How would the time complexity change?"
Practice
Solution
Step 1: Understand the role of base case in recursion
The base case stops the recursion by providing a condition to end calls.Step 2: Analyze what happens without a base case
Without a base case, the function keeps calling itself endlessly, filling the call stack.Final Answer:
It causes an infinite loop leading to a stack overflow error -> Option BQuick Check:
No base case = infinite recursion = stack overflow [OK]
- Thinking recursion stops automatically
- Confusing base case with recursive case
- Assuming syntax error occurs without base case
countDown in JavaScript?Solution
Step 1: Identify correct base case and recursive call
function countDown(n) { if(n <= 0) return; countDown(n - 1); } has a base case (if n <= 0 return) and calls itself with n-1.Step 2: Check other options for syntax or logic errors
function countDown(n) { while(n > 0) countDown(n - 1); } uses while loop causing infinite recursion; C uses for loop incorrectly; D lacks proper base case.Final Answer:
function countDown(n) { if(n <= 0) return; countDown(n - 1); } -> Option AQuick Check:
Base case + recursive call = correct syntax [OK]
- Using loops instead of recursion
- Missing base case
- Wrong recursive call argument
function factorial(n) {
if (n === 0) return 1;
return n * factorial(n - 1);
}
console.log(factorial(3));Solution
Step 1: Trace factorial calls for n=3
factorial(3) = 3 * factorial(2); factorial(2) = 2 * factorial(1); factorial(1) = 1 * factorial(0); factorial(0) = 1.Step 2: Calculate return values step-by-step
factorial(1) = 1 * 1 = 1; factorial(2) = 2 * 1 = 2; factorial(3) = 3 * 2 = 6.Final Answer:
6 -> Option DQuick Check:
3! = 6 [OK]
- Confusing multiplication order
- Forgetting base case returns 1
- Calculating factorial(0) incorrectly
function sum(n) {
if (n === 1) return 1;
return n + sum(n);
}Solution
Step 1: Check the recursive call argument
The function calls sum(n) again without reducing n, causing infinite recursion.Step 2: Identify correct recursive call
It should call sum(n - 1) to reduce n and reach base case.Final Answer:
The recursive call uses the same argument causing infinite recursion -> Option CQuick Check:
Recursive call argument must change to reach base case [OK]
- Calling function with same argument
- Missing base case
- Using wrong operator in return
function reverseStr(str) {
if (str === "") return "";
return reverseStr(str.substring(1)) + str[0];
}
console.log(reverseStr("code"));What is the output and why?
Solution
Step 1: Understand recursion on string substring
The function calls itself with the string minus the first character each time.Step 2: Trace the concatenation on return
Each call adds the first character of the current string to the end of the reversed substring, reversing the string.Final Answer:
"edoc" because the function moves first character to the end recursively -> Option AQuick Check:
Recursive substring + concat reverses string [OK]
- Thinking substring does not change string
- Confusing base case effect
- Assuming syntax error with substring
Ready to prove it?
Pass the test and this pattern moves unknown
