이번 글에서는 두 개의 숫자 m과 n을 입력받아 m의 n제곱(m^n)을 계산해 반환하는 JavaScript 함수를 만들어 보겠습니다.
예를 들어, m = 4, n = 3일 때 결과는 다음과 같습니다.
power(4, 3) = 4^3 = 4 * 4 * 4 = 64
power(6, 3) = 216
JavaScript에는 기본적으로 Math.pow() 메서드가 존재하지만, 이번 예제에서는 재귀(Recursion)와 분할 정복 기법을 활용해 직접 거듭제곱 함수를 구현해 보겠습니다. 이 방식은 단순 반복 곱셈보다 연산 횟수가 적어 효율적입니다.
구현 코드
아래 코드는 재귀 호출을 사용하여 거듭제곱을 계산합니다. 지수가 짝수일 경우 절반으로 나누어 제곱하는 방식으로 연산량을 줄였습니다.
const power = (m, n) => {
// 지수가 음수인 경우 양수 지수로 변환
if(n < 0 && m !== 0){
return power(1/m, n*-1);
};
// 지수가 0이면 항상 1 반환
if(n === 0){
return 1;
}
// 지수가 1이면 밑값 그대로 반환
if(n === 1){
return m;
};
// 지수가 짝수인 경우: 분할 정복으로 연산 최적화
if (n % 2 === 0){
const res = power(m, n / 2);
return res * res;
}else{
// 지수가 홀수인 경우: 하나를 떼어내고 재귀 호출
return power(m, n - 1) * m;
};
};
console.log(power(4, 3));
console.log(power(6, 3));코드 동작 원리
이 알고리즘의 핵심은 다음 세 가지 규칙입니다.
1. 음수 지수 처리: 지수 n이 음수이면 (1/m)^|n| 형태로 변환하여 동일한 로직을 재사용합니다.
2. 짝수 지수 최적화: m^8 = (m^4)² 처럼 지수를 절반으로 나눈 뒤 결과를 제곱하면, 곱셈 횟수를 O(n)에서 O(log n) 수준으로 크게 줄일 수 있습니다.
3. 홀수 지수 처리: 지수가 홀수라면 m^(n-1) × m으로 분해하여 짝수 지수 문제로 변환한 후 재귀적으로 해결합니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다.
64
216
이처럼 재귀와 분할 정복을 활용하면 Math.pow() 없이도 효율적인 거듭제곱 함수를 손쉽게 구현할 수 있습니다.