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

JavaScript 재귀 함수로 중첩 배열에서 최댓값 찾기

JavaScript에서 임의의 깊이까지 중첩된 숫자 배열을 입력받아, 그 안에 있는 가장 큰 수를 반환하는 간단한 함수를 작성해 보겠습니다.

문제 정의

예를 들어 다음과 같은 입력 배열이 주어졌다고 가정해 봅시다.

const arr = [
    34, 65, 67,
    [
        43, 76, 87, 23, 56, 7,
        [
            54, 7, 87, 23, 79, 314, 2
        ],
        54
    ], 54, 4, 2
];

이 경우 기대하는 출력 결과는 다음과 같습니다.

314

배열이 몇 단계든 중첩될 수 있으므로, 반복문만으로는 처리하기 어렵습니다. 이럴 때 재귀(recursion)를 사용하면 배열 안의 배열을 끝까지 탐색하며 최댓값을 찾을 수 있습니다.

구현 예제

배열의 각 요소를 순회하면서 요소가 배열이면 자기 자신을 다시 호출하고, 그렇지 않으면 현재까지의 최댓값과 비교하는 방식으로 구현합니다.

const arr = [
    34, 65, 67,
    [
        43, 76, 87, 23, 56, 7,
        [
            54, 7, 87, 23, 79, 314, 2
        ],
        54
    ], 54, 4, 2
];

const findGreatest = (arr, greatest = -Infinity) => {
    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            // 중첩 배열이면 재귀 호출하여 결과를 최댓값에 반영
            greatest = findGreatest(arr[i], greatest);
        } else if (arr[i] > greatest) {
            greatest = arr[i];
        }
    }
    return greatest;
};

console.log(findGreatest(arr)); // 314

코드 설명

  • 기본값 -Infinity: 초기 최댓값을 음의 무한대로 설정하면 어떤 숫자와 비교해도 항상 올바르게 갱신됩니다.
  • 배열 판별: Array.isArray()로 요소가 배열인지 확인한 뒤, 배열이라면 같은 함수를 재귀적으로 호출해 내부 값을 모두 탐색합니다.
  • 결과 병합: 재귀 호출의 반환값을 현재 greatest에 다시 할당해야 중첩 배열 뒤에 위치한 더 큰 값도 놓치지 않고 비교할 수 있습니다.

실행 결과

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

314

이처럼 재귀를 활용하면 중첩 깊이가 몇 단계든 상관없이 배열 전체를 탐색하며 최댓값을 안정적으로 구할 수 있습니다.