배열에서 가장 작은 숫자를 찾아야 할 때, 반복문 대신 재귀(Recursion)를 활용하면 우아하게 해결할 수 있습니다. 이 글에서는 JavaScript의 재귀 함수를 사용해 배열 내 최솟값을 구하는 방법을 단계별로 살펴보겠습니다.
예제 배열 준비
먼저 다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.
var numbers = [10, 101, 76, 56, 5, 210, 3, 100];
이 배열에서 최솟값인 3을 찾아내는 것이 목표입니다.
재귀 함수로 최솟값 찾기
재귀 방식의 핵심 아이디어는 다음과 같습니다.
- 배열에 요소가 하나만 남으면 그 값이 곧 최솟값입니다.
- 첫 번째 요소가 두 번째 요소보다 크면 첫 번째 요소를 버리고 나머지 배열로 재귀 호출합니다.
- 그렇지 않으면 첫 번째 요소를 유지한 채 두 번째 요소를 제외하고 재귀 호출합니다.
이 로직을 코드로 구현하면 다음과 같습니다.
코드 예제
function findMinimumElementUsingRecursive(numbers) {
// 배열에 요소가 하나만 남으면 그것이 최솟값
if (numbers.length == 1) {
return numbers[0];
}
// 첫 번째 요소가 두 번째보다 크면 첫 번째 요소 제거 후 재귀 호출
else if (numbers[0] > numbers[1]) {
return findMinimumElementUsingRecursive(numbers.slice(1));
}
// 첫 번째 요소가 더 작으면 두 번째 요소 제거 후 재귀 호출
else {
return findMinimumElementUsingRecursive(
[numbers[0]].concat(numbers.slice(2))
);
}
}
var numbers = [10, 101, 76, 56, 5, 210, 3, 100];
console.log("최솟값 = " + findMinimumElementUsingRecursive(numbers));프로그램 실행 방법
위 코드를 파일로 저장한 뒤, Node.js 환경에서 다음 명령어로 실행할 수 있습니다.
node fileName.js
여기서는 파일 이름을 demo152.js로 저장했다고 가정하겠습니다.
실행 결과
터미널에서 프로그램을 실행하면 다음과 같은 출력 결과를 확인할 수 있습니다.
PS C:\Users\Amit\JavaScript-code> node demo152.js 최솟값 = 3
동작 원리 정리
이 재귀 함수는 매 호출마다 비교 대상 중 하나의 요소를 제거하며 배열의 크기를 점차 줄여갑니다. 결국 요소가 하나만 남는 순간, 그 값이 전체 배열의 최솟값이 됩니다.
다만 slice()와 concat()을 사용하기 때문에 매번 새로운 배열이 생성되며, 배열이 클 경우 성능 면에서 비효율적일 수 있습니다. 실무에서는 Math.min(...numbers)나 reduce() 메서드를 활용하는 것이 더 간결하고 효율적인 대안이 될 수 있습니다.