Recursive Power of 2 - codepath/compsci_guides GitHub Wiki
Unit 7 Session 1 (Click for link to problem statements)
Problem Highlights
- 💡 Difficulty: Medium
- ⏰ Time to complete: 15 mins
- 🛠️ Topics: Recursion, Mathematics, Powers of Two
1: U-nderstand
Understand what the interviewer is asking for by using test cases and questions about the problem.
- Established a set (2-3) of test cases to verify their own solution later.
- Established a set (1-2) of edge cases to verify their solution handles complexities.
- Have fully understood the problem and have no clarifying questions.
- Have you verified any Time/Space Constraints for this problem?
- Q: What should the function return for
n = 0
?- A: The function should return
False
since 0 is not a power of two.
- A: The function should return
HAPPY CASE
Input: 8
Output: True
Explanation: (8 = 2^3), hence it is a power of two.
EDGE CASE
Input: 0
Output: False
Explanation: 0 is not a power of any positive integer.
2: M-atch
Match what this problem looks like to known categories of problems, e.g. Linked List or Dynamic Programming, and strategies or patterns in those categories.
This problem aligns with a mathematical and recursive decomposition problem, focusing on:
- Understanding properties of powers of two.
- Reducing the problem size by dividing the number recursively.
3: P-lan
Plan the solution with appropriate visualizations and pseudocode.
General Idea: Use a recursive method to determine if a number is a power of two by continuously dividing the number by two.
1) Base Case: If `n` is 1, return True because \(2^0 = 1\).
2) If `n` is less than 1 or not divisible by 2, return False.
3) Recursive Case: Recursively call the function with \(n/2\).
⚠️ Common Mistakes
- Not correctly identifying non-powers of two that are not immediately obvious (e.g., 0 or negative numbers).
4: I-mplement
Implement the code to solve the algorithm.
def is_power_of_two(n):
# Base case: if n is 1, it's a power of 2
if n == 1:
return True
# Base case: if n is less than 1 or not divisible by 2, it's not a power of 2
elif n < 1 or n % 2 != 0:
return False
# Recursive case: recursively check if n divided by 2 is a power of 2
else:
return is_power_of_two(n // 2)
5: R-eview
Review the code by running specific example(s) and recording values (watchlist) of your code's variables along the way.
- Trace through your code with an input of 8 to check for the expected output of True.
- Validate the edge case with input 0 and other non-powers like 3 to ensure the function returns False.
6: E-valuate
Evaluate the performance of your algorithm and state any strong/weak or future potential work.
- Time Complexity:
O(log n)
because each recursive call reduces the problem size by half. - Space Complexity:
O(log n)
due to the recursion stack depth, also reducing by half each time.