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

재귀 함수만으로 JavaScript 배열의 홀수와 짝수를 분류하는 방법

숫자 배열을 입력받아 odd(홀수)even(짝수) 속성을 가진 객체를 반환하는 재귀 함수, 예를 들어 pushRecursively()를 작성해야 합니다. 여기서 odd는 입력 배열에서 추출한 홀수들의 배열, even은 짝수들의 배열입니다. 이 문제는 반드시 재귀(recursion) 방식으로 해결해야 하며, for문이나 forEach 같은 어떤 종류의 반복문도 사용해서는 안 됩니다.

코드 예제

const arr = [12,4365,76,43,76,98,5,31,4];
const pushRecursively = (arr, len = 0, odd = [], even = []) => {
   if(len < arr.length){
      arr[len] % 2 === 0 ? even.push(arr[len]) : odd.push(arr[len]);
      return pushRecursively(arr, ++len, odd, even);
   };
   return {
      odd,
      even
   }
};
console.log(pushRecursively(arr));

동작 원리

이 함수의 핵심은 인덱스(len)를 기준으로 자기 자신을 반복 호출하는 것입니다. 동작 과정을 단계별로 살펴보면 다음과 같습니다.

1. 기본 매개변수(default parameter)를 활용해 len은 0부터 시작하고, odd와 even은 빈 배열로 초기화됩니다.
2. len이 배열 길이보다 작은 동안 현재 요소를 2로 나눈 나머지를 확인하여, 나머지가 0이면 even 배열에, 아니면 odd 배열에 값을 추가합니다.
3. len을 1 증가시킨 뒤 함수를 다시 호출하며, 이 과정이 배열의 끝까지 반복됩니다.
4. len이 배열의 길이와 같아지면 재귀 호출을 멈추고(종료 조건), 홀수 배열과 짝수 배열을 담은 객체를 반환합니다.

실행 결과

위 코드를 콘솔에서 실행하면 다음과 같은 결과가 출력됩니다.

{ odd: [ 4365, 43, 5, 31 ], even: [ 12, 76, 76, 98, 4 ] }

이처럼 반복문 없이도 재귀 호출과 종료 조건만으로 배열의 모든 요소를 순회하며 홀수와 짝수를 깔끔하게 분류할 수 있습니다. 다만 배열의 길이가 매우 클 경우 콜 스택 오버플로우가 발생할 수 있으므로, 실무에서는 데이터 크기를 고려해 적용하는 것이 좋습니다.