Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript 재귀 함수로 배열의 중간 요소 찾기

배열의 length 속성에 접근하지 않고, 어떠한 내장 반복문도 사용하지 않은 채 배열의 가운데 요소를 반환하는 함수 findMiddle을 작성해야 합니다. 배열의 요소 개수가 홀수라면 가장 중앙에 있는 하나의 요소를 반환하고, 짝수라면 중앙에 위치한 두 개의 요소를 담은 배열을 반환해야 합니다.

접근 방식: 재귀를 활용한 구현

이 문제는 재귀(recursion)를 활용하면 깔끔하게 해결할 수 있습니다. 핵심 아이디어는 다음과 같습니다.

  • 인덱스를 0부터 시작해 재귀 호출마다 1씩 증가시키며 배열을 순회합니다.
  • 현재 인덱스에 해당하는 요소가 존재하지 않으면(즉, 배열의 끝에 도달하면) 재귀를 종료합니다.
  • 이 시점의 인덱스 값이 곧 배열의 실제 길이가 되므로, 이 값을 이용해 중앙 요소의 위치를 계산합니다.

코드 예제

const arr = [1, 2, 3, 4, 5, 6, 7];
const array = [1, 2, 3, 4, 5, 6, 7, 8];

const findMiddle = (arr, ind = 0) => {
  if(arr[ind]){
    return findMiddle(arr, ++ind);
  };
  return ind % 2 !== 0
    ? [arr[(ind-1) / 2]]
    : [arr[(ind/2)-1], arr[ind/2]];
};

console.log(findMiddle(arr));
console.log(findMiddle(array));

코드 동작 원리

  1. 재귀 순회: findMiddle 함수는 두 번째 매개변수 ind(기본값 0)를 받아 현재 인덱스의 요소가 존재하는 동안 자기 자신을 호출하며 인덱스를 증가시킵니다.
  2. 종료 조건: arr[ind]undefined가 되는 순간, 즉 배열의 끝에 도달하면 재귀가 멈춥니다. 이때의 ind 값이 배열의 전체 길이입니다.
  3. 중앙 요소 계산: 길이가 홀수(ind % 2 !== 0)라면 정확히 하나의 중앙 요소를, 짝수라면 중앙에 인접한 두 요소를 배열로 감싸 반환합니다.

실행 결과

콘솔 출력 결과는 다음과 같습니다.

[ 4 ]
[ 4, 5 ]

7개의 요소를 가진 첫 번째 배열에서는 네 번째 요소인 4가, 8개의 요소를 가진 두 번째 배열에서는 중앙의 두 요소인 45가 각각 반환된 것을 확인할 수 있습니다.

마무리

이처럼 재귀를 활용하면 length 속성이나 for, while 같은 반복문 없이도 배열의 중앙 요소를 우아하게 찾아낼 수 있습니다. 다만 배열의 크기가 매우 클 경우 재귀 호출 스택이 깊어질 수 있으므로, 실무에서는 이 점을 고려해 적절히 활용하는 것이 좋습니다.