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

추가 변수 없이 JavaScript 재귀 함수로 배열의 모든 요소 합계 구하기

숫자 배열의 모든 요소를 합산하는 재귀 함수를 작성해야 한다고 가정해 봅시다. 그런데 여기에 조건이 하나 있습니다. 바로 작성하는 재귀 함수가 어떠한 추가 변수(메모리)도 초기화할 수 없다는 점입니다.

즉, 합계를 저장하거나 배열의 인덱스를 카운트하기 위한 변수를 사용할 수 없으며, 이미 가지고 있는 것만으로 문제를 해결해야 합니다.

해결 방법

핵심 아이디어는 간단합니다. 우리에게는 이미 배열이 있으므로, 배열의 첫 번째 요소(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. 배열의 길이가 1보다 큰지 확인합니다. 크다면 pop() 메서드로 마지막 요소를 제거하고, 그 값을 첫 번째 요소인 arr[0]에 더합니다.
  2. 변경된 배열을 인수로 하여 자기 자신(recursiveSum)을 다시 호출합니다.
  3. 배열의 길이가 1이 되면 재귀 호출을 멈추고 arr[0], 즉 누적된 합계를 반환합니다.

빈 배열을 입력한 세 번째 예제에서 undefined가 출력되는 이유는, 빈 배열에는 arr[0]이 존재하지 않기 때문입니다. 따라서 실무에서 사용한다면 빈 배열 처리 로직을 추가하여 0을 반환하도록 하는 것이 좋습니다.