Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

JavaScript에서 재귀를 사용하여 접두사 합계(합계가 증가하는 배열 생성)

<시간/>

다음 숫자 배열을 고려하십시오 -

const arr = [10, 5, 6, 12, 7, 1];

모든 이동에서 요소를 하나 적게 차지하는 연속 요소의 합은 -

[10, 5, 6, 12, 7, 1] = 10 + 5 + 6 + 12 + 7 + 1 = 41;
[5, 6, 12, 7, 1] = 5 + 6 + 12 + 7 + 1 = 31;
[6, 12, 7, 1] = 6 + 12 + 7 + 1 = 26;
[12, 7, 1] = 12 + 7 + 1 = 20;
[7, 1] = 7 + 1 = 8;
[1] = 1 = 1;

따라서 최종 출력은 다음과 같은 배열이어야 합니다. -

[ 41, 31, 26, 20, 8, 1 ]

위의 예와 같이 이러한 배열 중 하나를 가져와서 partialSum 배열을 반환하는 함수를 작성해야 합니다.

접근법 1:map()과 reduce()를 함께 사용

여기서 아이디어는 간단합니다. 배열의 모든 요소에 대해 하나의 특정 요소를 반환해야 하기 때문에 정확히 이 작업을 수행하는 Array.prototype.map() 메서드를 사용할 수 있습니다.

그리고 특정 인덱스를 비교하여 필요한 요소의 축소된 합계를 반환하는 map() 메서드를 만들면 작업이 완료됩니다.

다음은 이 작업을 수행하는 코드입니다. -

const arr = [10, 5, 6, 12, 7, 1];
const partSum = arr.map((item, index) => {
   return arr.reduce((acc, val, ind) => {
      return ind >= index ? acc+val : acc;
   }, 0);
});
console.log(partSum);

접근법 2:재귀 함수 사용

여기서 우리는 두 개의 재귀 함수를 사용할 것입니다.

  • 첫 번째는 인덱스 시작부터 끝까지의 요소 합계를 반환하는 sumRecursively(arr, start)입니다.

  • 두 번째는 필요한 합계를 배열에 재귀적으로 연결하고 배열의 끝에 도달하면 연결된 배열을 반환하는 partSumRecursively()입니다.

이 작업을 수행하는 코드는 -

입니다.

예시

const arr = [10, 5, 6, 12, 7, 1];
const sumRecursively = (arr, start = 0, res = 0) => {
   if(start < arr.length){
      return sumRecursively(arr, start+1, res+arr[start]);
   };
   return res;
};
const partSumRecursively = (arr, partSum = [], start = 0, end =
arr.length-1) => {
   if(start <= end){
      return partSumRecursively(arr, partSum.concat(sumRecursively(arr,
      start)), ++start, end);
   };
   return partSum;
};
console.log(partSumRecursively(arr));

출력

두 방법 모두에 대한 콘솔의 출력은 다음과 같습니다. -

[ 41, 31, 26, 20, 8, 1 ]