이번 글에서는 배열의 length 속성에 접근하지 않고, 내장 반복문(for, while 등)도 사용하지 않고 배열의 가장 중간에 있는 요소를 반환하는 함수 midElement()를 작성해 보겠습니다.
요구 사항은 다음과 같습니다.
- 배열의 요소 개수가 홀수라면, 정확히 가운데 있는 요소 하나를 반환합니다.
- 배열의 요소 개수가 짝수라면, 가운데 두 개의 요소를 담은 배열을 반환합니다.
핵심 아이디어는 인덱스를 하나씩 증가시키며 자기 자신을 호출하는 재귀(recursion)를 활용해 배열의 끝, 즉 유효하지 않은 인덱스에 도달할 때까지 탐색하는 것입니다. 이렇게 하면 length 속성을 참조하지 않고도 배열의 전체 크기를 알아낼 수 있습니다.
구현 예제
전체 코드는 다음과 같습니다.
const arr = [14, 32, 36, 42, 45, 66, 87];
const array = [13, 92, 83, 74, 55, 46, 74, 82];
const midElement = (arr, ind = 0) => {
// 현재 인덱스에 요소가 존재하면 재귀 호출로 다음 인덱스를 확인
if (arr[ind]) {
return midElement(arr, ++ind);
}
// 요소 개수(ind)가 홀수면 중간 요소 하나, 짝수면 중간 요소 두 개를 반환
return ind % 2 !== 0
? [arr[(ind - 1) / 2]]
: [arr[(ind / 2) - 1], arr[ind / 2]];
};
console.log(midElement(arr));
console.log(midElement(array));코드 동작 원리
midElement 함수는 기본값이 0인 인덱스 매개변수 ind를 받습니다.
- 재귀 탐색 단계:
arr[ind]가 존재하는 한(즉, 해당 인덱스에 값이 있는 한), 인덱스를 1씩 증가시키며 자기 자신을 다시 호출합니다. 배열 범위를 벗어나면arr[ind]는undefined가 되므로 조건문이 거짓이 되어 재귀가 종료됩니다. 이 시점의ind값이 곧 배열의 실제 요소 개수입니다. - 중간 요소 계산 단계: 요소 개수가 홀수라면
(ind - 1) / 2번째 인덱스의 요소 하나를 배열로 감싸 반환하고, 짝수라면ind / 2 - 1번째와ind / 2번째, 즉 가운데 두 요소를 배열로 묶어 반환합니다.
실행 결과
콘솔 출력 결과는 다음과 같습니다.
[ 42 ] [ 74, 55 ]
첫 번째 배열 [14, 32, 36, 42, 45, 66, 87]은 요소가 7개(홀수)이므로 정확히 가운데인 42 하나가 반환되었고, 두 번째 배열 [13, 92, 83, 74, 55, 46, 74, 82]는 요소가 8개(짝수)이므로 가운데 두 요소인 74와 55가 배열 형태로 반환된 것을 확인할 수 있습니다.
마무리
이처럼 재귀 함수를 활용하면 length 속성이나 반복문 없이도 배열의 크기를 파악하고 중간 요소를 손쉽게 찾을 수 있습니다. 다만 배열의 길이가 매우 긴 경우에는 재귀 호출 깊이 제한(스택 오버플로우)에 유의해야 하며, 실무에서는 일반적으로 Math.floor(arr.length / 2) 방식이 더 효율적이라는 점도 함께 기억해 두면 좋습니다.