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