Recursive functions in R Programming - Time & Space Complexity
When we use recursive functions, the program calls itself repeatedly. We want to know how the time it takes grows as the input gets bigger.
How many times does the function call itself and how does that affect the total work done?
Analyze the time complexity of the following code snippet.
factorial <- function(n) {
if (n <= 1) {
return(1)
} else {
return(n * factorial(n - 1))
}
}
This function calculates the factorial of a number by calling itself with smaller numbers until it reaches 1.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The function calls itself once per step, reducing n by 1 each time.
- How many times: It repeats this call n times until it reaches the base case.
Each time we increase n by 1, the function does one more call. So the work grows steadily with n.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 calls |
| 100 | About 100 calls |
| 1000 | About 1000 calls |
Pattern observation: The number of calls grows directly with n, so doubling n doubles the work.
Time Complexity: O(n)
This means the time taken grows in a straight line with the size of the input number.
[X] Wrong: "Recursive functions always take more time than loops because they call themselves multiple times."
[OK] Correct: Some recursive functions call themselves only once per step, just like a loop. So their time grows linearly, not more.
Understanding how recursion affects time helps you explain your code clearly and choose the best approach. It shows you can think about how programs grow with input size.
"What if the recursive function called itself twice each time, like in a Fibonacci calculation? How would the time complexity change?"
Practice
recursive function?Solution
Step 1: Understand recursion basics
A recursive function calls itself repeatedly with smaller inputs.Step 2: Identify the role of base case
The base case stops the recursion to avoid infinite loops and eventual crash.Final Answer:
To stop the recursion and prevent infinite calls -> Option AQuick Check:
Base case = stop recursion [OK]
- Forgetting the base case causes infinite recursion
- Thinking base case calls function again
- Confusing base case with recursive step
fact in R that calculates factorial?Solution
Step 1: Check base case and recursive call
fact <- function(n) { if(n == 0) 1 else n * fact(n - 1) } correctly uses if condition for base case (n == 0) and recursive call with n-1.Step 2: Identify syntax errors in other options
Options B, C, and D misuse loops or have wrong base case or missing else.Final Answer:
fact <- function(n) { if(n == 0) 1 else n * fact(n - 1) } -> Option DQuick Check:
Correct base case and recursive call syntax [OK]
- Using loops instead of recursion
- Missing else leads to errors
- Wrong base case condition
fib <- function(n) {
if (n <= 1) return(n)
else return(fib(n-1) + fib(n-2))
}
fib(4)Solution
Step 1: Trace fib(4) calls
fib(4) = fib(3) + fib(2); fib(3) = fib(2) + fib(1); fib(2) = fib(1) + fib(0)Step 2: Calculate values bottom-up
fib(1)=1, fib(0)=0; fib(2)=1+0=1; fib(3)=1+1=2; fib(4)=2+1=3Final Answer:
3 -> Option CQuick Check:
Fibonacci(4) = 3 [OK]
- Confusing index starting at 0 or 1
- Adding wrong recursive calls
- Forgetting base cases
sum_to_n <- function(n) {
if (n == 1) return(1)
else return(n + sum_to_n(n))
}
sum_to_n(3)Solution
Step 1: Check recursive call argument
The function calls sum_to_n(n) instead of sum_to_n(n-1), so input never decreases.Step 2: Understand effect of error
This causes infinite recursion because n stays the same and base case is never reached.Final Answer:
The recursive call uses the same n, causing infinite recursion -> Option AQuick Check:
Recursive call must reduce input [OK]
- Calling function with same argument
- Missing base case
- Confusing recursion with loops
flatten_list that takes a nested list of numbers and returns a flat vector of all numbers.What is the correct approach?
Solution
Step 1: Identify recursive structure
Nested lists require checking each element; if it's a list, call flatten_list recursively.Step 2: Combine results properly
Combine all flattened elements into one vector to get a flat list of numbers.Final Answer:
Check if input is a list; if yes, recursively flatten each element and combine; else return the element as vector -> Option BQuick Check:
Recursion + combine results = flatten list [OK]
- Not combining recursive results
- Forgetting to check if element is a list
- Using loops only without recursion
Ready to prove it?
Pass the test and this pattern moves unknown
