숫자 배열의 모든 요소를 합산하는 재귀 함수를 작성해야 한다고 가정해 봅시다. 그런데 여기에 조건이 하나 있습니다. 바로 작성하는 재귀 함수가 어떠한 추가 변수(메모리)도 초기화할 수 없다는 점입니다.
즉, 합계를 저장하거나 배열의 인덱스를 카운트하기 위한 변수를 사용할 수 없으며, 이미 가지고 있는 것만으로 문제를 해결해야 합니다.
해결 방법
핵심 아이디어는 간단합니다. 우리에게는 이미 배열이 있으므로, 배열의 첫 번째 요소(0번 인덱스의 요소)를 재귀 합계를 담는 저장 공간으로 활용하면 됩니다.
접근 방식은 다음과 같습니다.
- 배열에서 요소를 하나씩 꺼내(pop) 첫 번째 요소에 계속 더합니다.
- 배열에 요소가 하나만 남을 때까지 이 과정을 반복합니다.
- 마지막에 남은 단 하나의 요소가 곧 배열 전체의 누적 합계이며, 그 값을 반환합니다.
코드 예제
const recursiveSum = arr => {
if(arr.length > 1){
arr[0] += arr.pop();
return recursiveSum(arr);
};
return arr[0];
};
console.log(recursiveSum([1,2,3,4]));
console.log(recursiveSum([1,2,3,4,3,6,3,32,7,9,5]));
console.log(recursiveSum([]));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
10 75 undefined
동작 원리 살펴보기
위 코드의 동작 과정을 단계별로 살펴보면 다음과 같습니다.
- 배열의 길이가 1보다 큰지 확인합니다. 크다면
pop()메서드로 마지막 요소를 제거하고, 그 값을 첫 번째 요소인arr[0]에 더합니다. - 변경된 배열을 인수로 하여 자기 자신(
recursiveSum)을 다시 호출합니다. - 배열의 길이가 1이 되면 재귀 호출을 멈추고
arr[0], 즉 누적된 합계를 반환합니다.
빈 배열을 입력한 세 번째 예제에서 undefined가 출력되는 이유는, 빈 배열에는 arr[0]이 존재하지 않기 때문입니다. 따라서 실무에서 사용한다면 빈 배열 처리 로직을 추가하여 0을 반환하도록 하는 것이 좋습니다.