이 글에서는 재귀(recursion)를 활용해 거듭제곱을 계산하는 방법을 알아봅니다. 재귀 함수란 특정 조건이 충족될 때까지 자기 자신을 반복적으로 호출하는 함수를 의미합니다.
재귀란 무엇인가?
재귀는 대상을 자기 유사적(self-similar) 형태로 반복 처리하는 과정입니다. 프로그래밍 언어에서 어떤 함수가 자기 자신을 다시 호출할 수 있을 때, 이를 재귀 호출(recursive call)이라고 부릅니다.
대다수 프로그래밍 언어는 스택(stack)을 통해 재귀를 구현합니다. 일반적으로 한 함수(호출자)가 다른 함수 또는 자기 자신(피호출자)을 호출하면 호출자는 실행 제어권을 피호출자에게 넘기며, 이 과정에서 인자로 전달되는 데이터가 함께 넘어갈 수 있습니다.
문제 정의
밑(base)과 지수(exponent) 두 정수를 입력받아, 밑을 지수만큼 곱한 거듭제곱 결과를 구하는 것이 목표입니다.
입력 예시:
숫자와 지수 입력: 2와 5
출력 예시:
2^5의 결과는 32입니다.
알고리즘
1단계 - 시작 2단계 - 정수 변수 세 개 선언: my_input(밑), my_power(지수), result(결과) 3단계 - 사용자로부터 값 입력 또는 값 사전 정의 4단계 - 정수 두 개를 매개변수로 받아, 첫 번째 값을 두 번째 값(my_power) 횟수만큼 곱한 결과를 반환하는 재귀 함수 getPower 정의 5단계 - my_power가 0보다 클 때까지 함수를 재귀적으로 호출하며 결과 저장 6단계 - 결과 출력 7단계 - 종료
핵심 원리
getPower 함수는 지수가 0이 아닌 동안 밑 값에 자기 자신의 반환값을 곱하고, 지수를 하나씩 줄여가며 호출을 반복합니다. 지수가 0이 되면 1을 반환하는데, 이것이 바로 재귀의 종료 조건(base case)입니다. 결국 x^n = x × x^(n-1)이라는 수학적 정의를 그대로 코드로 옮긴 구조라고 할 수 있습니다.
예제 1: 사용자 입력을 받는 경우
사용자로부터 숫자와 지수를 직접 입력받아 계산하는 예제입니다. Scanner 클래스를 활용해 콘솔 입력을 처리합니다.
import java.util.Scanner;
public class Power {
public static void main(String[] args) {
int my_power, my_input, result;
my_input = 2;
my_power = 5;
System.out.println("Required packages have been imported");
Scanner my_scanner = new Scanner(System.in);
System.out.println("A reader object has been defined ");
System.out.print("Enter the number : ");
my_input = my_scanner.nextInt();
System.out.print("Enter the power value : ");
my_power = my_scanner.nextInt();
result = getPower(my_input, my_power);
System.out.println("The result of " +my_input + "^" + my_power + " is " + result);
}
public static int getPower(int my_input, int my_power) {
if (my_power != 0) {
return (my_input * getPower(my_input, my_power - 1));
}
else {
return 1;
}
}
}실행 결과
Required packages have been imported A reader object has been defined Enter the number : 2 Enter the power value : 5 The result of 2^5 is 32
예제 2: 값이 미리 정의된 경우
별도의 사용자 입력 없이 정수 값이 코드 안에서 미리 정의되어 있으며, 해당 값을 읽어 결과를 콘솔에 출력합니다.
public class Power {
public static void main(String[] args) {
int my_power, my_input, result;
my_input = 2;
my_power = 5;
System.out.println("The number and its power is defined as " +my_input + " and " +my_power);
result = getPower(my_input, my_power);
System.out.println("The result of " +my_input + "^" + my_power + " is " + result);
}
public static int getPower(int my_input, int my_power) {
if (my_power != 0) {
return (my_input * getPower(my_input, my_power - 1));
}
else {
return 1;
}
}
}실행 결과
The number and its power is defined as 2 and 5 The result of 2^5 is 32