[java] 스택을 이용한 재귀 알고리즘 구현하기
재귀 알고리즘은 함수가 자기 자신을 호출하는 방식으로 동작하는 알고리즘입니다. 이러한 알고리즘은 대부분 재귀 호출을 이용하여 구현됩니다. 하지만 재귀 호출은 함수 호출과 관련된 추가적인 메모리를 소비할 수 있으며, 스택 오버플로우와 같은 문제가 발생할 수 있습니다.
이러한 문제를 해결하기 위해 스택을 이용하여 재귀 알고리즘을 구현할 수 있습니다. 스택은 함수 호출 정보를 저장하고 복구하는 데에 사용됩니다. 자바에서는 java.util.Stack 클래스를 사용하여 스택을 구현할 수 있습니다.
다음은 스택을 이용하여 팩토리얼을 계산하는 재귀 알고리즘의 구현 예시입니다.
import java.util.Stack;
public class RecursiveAlgorithmWithStack {
public static int factorial(int n) {
Stack<Integer> stack = new Stack<>();
stack.push(n);
int result = 1;
while (!stack.isEmpty()) {
int num = stack.pop();
if (num > 1) {
stack.push(num - 1);
result *= num;
} else {
result *= num;
}
}
return result;
}
public static void main(String[] args) {
System.out.println(factorial(5)); // 출력: 120
}
}
위의 예시 코드에서는 팩토리얼을 계산하는 함수인 factorial
을 구현하였습니다. 스택을 생성하고 첫 번째 값으로 n
을 push합니다. 그 후, 스택이 비어있을 때까지 반복문을 실행합니다. 스택에서 값을 하나씩 꺼내며 다음의 조건에 따라 처리합니다.
- 꺼낸 값이 1보다 크면, 값을 1 감소시킨 후 스택에 push하고, 결과값에 현재 값(
num
)을 곱합니다. - 꺼낸 값이 1이라면, 결과값에 현재 값(
num
)을 곱합니다.
위의 예시 코드를 실행하면 factorial(5)
의 결과인 120
이 출력됩니다.
스택을 이용한 재귀 알고리즘 구현은 재귀 호출에 비해 추가적인 메모리를 사용하지 않으며, 스택 오버플로우 문제도 회피할 수 있습니다. 이를 통해 더 효율적인 프로그램을 개발할 수 있습니다.
참고 문서: