Swiftorial Logo
Home
Swift Lessons
Matchups
CodeSnaps
Tutorials
Career
Resources
Power of a Number (x^n)

Power of a Number (x^n)

Problem Statement

Calculate x raised to the power n (x^n), where x is a real number and n is an integer. This medium-level problem showcases recursion with a twist: instead of naively multiplying x n times, use the divide-and-conquer approach (x^n = x^(n/2) × x^(n/2)) to optimize performance. Handle positive, negative, and zero exponents—perfect for mastering recursive efficiency!

Example

Input: x = 2.0, n = 10

Output: 1024.0 (2^10 = 1024)

Input: x = 2.1, n = 3

Output: 9.261 (2.1 × 2.1 × 2.1 ≈ 9.261)

Input: x = 2.0, n = -2

Output: 0.25 (2^-2 = 1 / 2^2 = 0.25)

Code

Java
Python
JavaScript
public class Solution {
    public double myPow(double x, int n) {
        if (n == 0) return 1.0; // Base case
        if (n < 0) return 1.0 / myPow(x, -n); // Handle negative exponents
        
        double half = myPow(x, n / 2); // Recursive step
        if (n % 2 == 0) {
            return half * half; // Even exponent
        } else {
            return half * half * x; // Odd exponent
        }
    }
}
            
def my_pow(x, n):
    if n == 0:
        return 1.0  # Base case
    if n < 0:
        return 1.0 / my_pow(x, -n)  # Handle negative exponents
    
    half = my_pow(x, n // 2)  # Recursive step
    if n % 2 == 0:
        return half * half    # Even exponent
    else:
        return half * half * x  # Odd exponent

# Example usage
print(my_pow(2.0, 10))  # 1024.0
print(my_pow(2.1, 3))   # 9.261
print(my_pow(2.0, -2))  # 0.25
            
function myPow(x, n) {
    if (n === 0) return 1.0; // Base case
    if (n < 0) return 1.0 / myPow(x, -n); // Handle negative exponents
    
    let half = myPow(x, Math.floor(n / 2)); // Recursive step
    if (n % 2 === 0) {
        return half * half; // Even exponent
    } else {
        return half * half * x; // Odd exponent
    }
}

// Example usage
console.log(myPow(2.0, 10)); // 1024
console.log(myPow(2.1, 3));  // 9.261
console.log(myPow(2.0, -2)); // 0.25
            

Explanation

  • Base Case: If n = 0, return 1, as any number to the power 0 is 1.
  • Negative Exponent: Convert to positive by taking the reciprocal (1/x^n).
  • Recursive Divide: Compute x^(n/2) once, then square it for even n, or square and multiply by x for odd n.
  • Flow Example (x=2, n=4): myPow(2, 4) → half = myPow(2, 2) → half = myPow(2, 1) → half = myPow(2, 0) * 2 = 2 → 2 * 2 = 4 → 4 * 4 = 16.
  • Optimization: Halving the problem size each step makes this much faster than linear recursion!

Note

Time complexity is O(log n) due to halving n each recursion. Space complexity is O(log n) for the call stack. This beats the O(n) naive approach—elegant and efficient!