거듭제곱 재귀에서 종료 조건과 줄어드는 입력은 어떻게 정하나요?
재귀는 같은 모양의 더 작은 문제를 함수에 맡기는 방법입니다. 멈출 답을 먼저 정하고, 모든 재귀 호출이 그 답에 가까워지도록 만들어야 합니다.
적용 조건·범위: 코드의 지수 상한 256은 학습 예제를 작게 유지하려는 제한입니다. 모든 JavaScript 환경의 최대 재귀 깊이가 256이라는 의미는 아닙니다. 실행 환경과 함수가 사용하는 스택 공간에 따라 한계가 달라지므로 아주 큰 지수를 처리할 일반 함수라면 반복문이나 제곱 분할 방식으로 설계를 바꾸는 편이 좋습니다.
본문 근거: MDN JavaScript Guide: Functions · MDN Glossary: Call stack
읽기 전에 알아두면 좋아요
아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.
- 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신변수에 값을 담고 조건에 따라 합·개수·최솟값을 갱신하는 기초부터 확인합니다.
- 자료구조 스택 쉽게 이해하기: push pop으로 문제 풀이 감 잡기스택은 마지막에 넣은 값을 먼저 꺼냅니다. 넣고 꺼낼 때 남는 순서를 확인합니다.
개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.
과정 위치와 선택 복습 안내
과정 위치: 재귀와 호출·복귀 · 알고리즘 개념
과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.
JavaScript로 문법·실행 복습하기 (선택)
개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.

재귀는 같은 모양의 더 작은 문제를 함수에 맡기는 방법입니다. 멈출 답을 먼저 정하고, 모든 재귀 호출이 그 답에 가까워지도록 만들어야 합니다.
선수 지식: 함수 호출과 반환값, if 조건문, 0 이상의 정수와 거듭제곱의 의미
- 재귀식과 기저 조건을 나누어 설명합니다.
- 입력 크기가 줄어드는지 확인하여 종료를 판단합니다.
- 수학적 종료와 JavaScript 실행 한계를 구분합니다.
2의 세제곱에서 하나의 곱셈을 떼어 내기
2³은 2를 세 번 곱한 값입니다. 마지막 2 하나를 떼면 2² × 2로 쓸 수 있습니다. 제곱을 구하는 방법을 이미 안다고 가정하면, 현재 함수가 남겨 둘 일은 작은 답에 2를 곱하는 한 단계뿐입니다. 이 관계를 power(x, n) = power(x, n - 1) × x로 나타냅니다.

여기서 작은 문제는 밑이 작은 문제가 아니라 지수가 하나 줄어든 문제입니다. 밑 x는 그대로 두고 n만 줄여야 처음 맡은 거듭제곱과 연결됩니다. power(2, 3)에서 무조건 power(1, 2)를 부르면 종료하더라도 다른 값을 계산하게 됩니다. 줄일 값과 유지할 값을 구분하는 것이 재귀 설계의 출발점입니다.
지수 0에서는 더 곱할 2가 없습니다. 곱셈을 이어 붙일 때 결과를 바꾸지 않는 값이 1이므로 power(x, 0)은 1을 반환합니다. 이 예제에서는 power(0, 0)도 같은 규칙에 따라 1로 정합니다. 해당 규칙은 이 함수의 입력 계약이며, 모든 맥락에서 0의 0제곱을 정의한다는 뜻은 아닙니다.
호출은 내려가고 곱셈은 돌아오며 끝납니다

| 단계 | 현재 작업 | 다음 상태의 이유 |
|---|---|---|
| 호출 3 | power(2, 2) × 2를 기다림 | 지수를 하나 줄여 같은 문제를 맡김 |
| 호출 2 | power(2, 1) × 2를 기다림 | 아직 지수가 0이 아님 |
| 호출 1 | power(2, 0) × 2를 기다림 | 마지막 곱셈도 작은 답을 필요로 함 |
| 기저 0 | 1 반환 | 재귀 호출 없이 답이 정해짐 |
| 복귀 1 → 2 → 3 | 2 → 4 → 8 반환 | 기다리던 곱셈을 역순으로 처리함 |
호출이 만들어지는 순서와 답이 완성되는 순서는 반대입니다. 지수 3인 함수는 지수 2의 반환값을 받을 때까지 끝나지 않습니다. 기저 조건에서 1을 반환한 뒤에야 1 × 2, 2 × 2, 4 × 2가 차례로 계산됩니다. 따라서 함수 첫 줄에서 어떤 값을 출력하는지와 반환값이 무엇인지는 별도로 읽어야 합니다.
멈출 조건과 그 조건에 도달할 조건은 다릅니다
n === 0이라는 조건만 있다고 재귀가 항상 멈추지는 않습니다. n이 -1이면 다음 호출은 -2가 되어 0에서 더 멀어집니다. 1.5도 0.5, -0.5로 바뀌어 정확한 0에 도달하지 않습니다. 이 함수는 재귀를 시작하기 전에 지수가 0 이상인 정수인지 검사합니다. 허용한 입력에서는 n이 매번 1씩 줄고 음수가 되기 전에 0을 만나므로 종료가 설명됩니다.

코드의 지수 상한 256은 학습 예제를 작게 유지하려는 제한입니다. 모든 JavaScript 환경의 최대 재귀 깊이가 256이라는 의미는 아닙니다. 실행 환경과 함수가 사용하는 스택 공간에 따라 한계가 달라지므로 아주 큰 지수를 처리할 일반 함수라면 반복문이나 제곱 분할 방식으로 설계를 바꾸는 편이 좋습니다.
밑은 유한한 Number만 받으며 계산 중 Infinity가 나오면 오류로 알립니다. 이 검사로 부동소수점 반올림까지 없어지지는 않습니다. 예를 들어 소수의 거듭제곱은 표현 가능한 근삿값이 될 수 있습니다. 재귀 구조를 배우는 동안에는 작은 정수로 호출 관계를 확인한 뒤 수 표현의 조건을 따로 넓히는 것이 좋습니다.
기저 조건은 결과의 의미와 비용을 함께 결정합니다
기저 조건을 0으로 반환하면 모든 복귀 단계가 0 × x가 되어 답이 모두 0이 됩니다. 기저 조건은 단순한 비상 탈출문이 아니라, 작은 문제의 정확한 답입니다. 더하기 재귀에서 빈 합이 0인 것과 곱하기 재귀에서 빈 곱이 1인 것을 비교하면 왜 문제마다 다른 값을 반환하는지 알 수 있습니다.

문제를 처음 설계할 때는 바로 답할 수 있는 가장 작은 입력을 적고, 그 답과 한 단계 큰 입력을 연결해 보세요. 곱할 값 하나를 보태도 원래 의미가 유지되는지 확인하면 종료만 하는 함수와 올바른 답을 계산하는 함수를 구분할 수 있습니다.
지수 n을 기준으로 호출은 n + 1번, 곱셈은 n번 발생하므로 시간은 O(n)입니다. 아래쪽 답을 기다리는 호출도 n개 정도 쌓여 추가 공간은 O(n)입니다. 소스에 반복문이 없다는 사실만 보고 시간이나 공간이 상수라고 판단하면 안 됩니다. 실제로 반복되는 호출 수와 동시에 살아 있는 호출 수를 각각 세어야 합니다.
전체 코드와 직접 실행
개념을 읽었다면 아래 예제를 직접 실행하며 상태 변화를 확인할 수 있습니다.
전체 JavaScript 코드와 실행 방법 펼치기
별도 패키지는 필요하지 않습니다. Node.js가 처음이라면 브라우저와 Node.js 시작 안내부터 확인하세요.
javascript-recursion-base-case.mjs 파일을 만들고 아래 전체 코드를 저장합니다.
function power(base, exponent) {
if (!Number.isFinite(base)) throw new TypeError('밑은 유한한 숫자여야 합니다.');
if (!Number.isInteger(exponent) || exponent < 0 || exponent > 256) {
throw new RangeError('지수는 0부터 256까지의 정수여야 합니다.');
}
function solve(n) {
if (n === 0) return 1;
const result = solve(n - 1) * base;
if (!Number.isFinite(result)) throw new RangeError('Number 범위를 벗어났습니다.');
return result;
}
return solve(exponent);
}
console.log(power(2, 3));
console.log(power(5, 0));
console.log(power(-2, 3));
파일이 있는 폴더의 터미널에서 실행합니다.
node javascript-recursion-base-case.mjs
기대 출력
8
1
-8
비용과 적용 범위
시간: O(n)

공간: O(n)
분석 조건: n은 지수이며 예제는 0~256의 정수만 받습니다. Number 곱셈을 상수 시간으로 세고, 대기 중인 호출 스택을 추가 공간에 포함합니다.
직접 확인해 보기
power(3, 2)가 호출하는 지수를 순서대로 적고, 기저 조건에서 1 대신 0을 반환하면 최종 값이 무엇인지 설명해 보세요.

답과 이유 확인
지수는 2 → 1 → 0입니다. 올바른 복귀값은 1 → 3 → 9입니다. 기저에서 0을 반환하면 0 × 3 × 3이 되어 0이므로 멈추더라도 정답은 틀립니다.
함께 읽을 글
- 기초 구현 패턴: 조건·정수 계산·순회·상태 갱신 — 조건문과 상태를 줄이는 기본 구현 방법을 복습합니다.
- 자료구조 스택 쉽게 이해하기: push pop으로 문제 풀이 감 잡기 — 뒤에 들어간 호출이 먼저 돌아오는 순서를 스택과 연결합니다.
참고 자료
- MDN JavaScript Guide: Functions — 자기 자신을 호출하는 함수와 재귀 호출의 중첩, 기저 조건을 참고했습니다. 호출·복귀 추적과 입력 계약은 별도로 구성했습니다.
- MDN Glossary: Call stack — 실행 중인 함수 호출을 쌓고 반환할 때 제거하는 호출 스택, 지나친 중첩의 제한을 참고했습니다.
이 글이 도움이 되었나요?
이어서 공부하기
체크포인트: 예제의 상태 변화를 손으로 추적하고 아래 문제에 적용하세요. 값이 없는 경우와 원소 하나인 경우도 설명해 보세요. 기저 조건에 도달하는 이유와 호출 뒤 돌아와 처리하는 작업을 작은 입력으로 설명하세요.
다음 추천 · 알고리즘 개념: 재귀적으로 생각하기: 배열 합의 호출과 복귀를 따라가기
권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.
원래 과정 목록 순서 (선택)
읽음 기록
읽음 — / 전체 30개 · 필수 0개
새 글 받아보기
RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.