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

JavaScript로 지정된 항 개수까지 수열의 합 구하기

알고리즘 문제에서 자주 만나는 수열 합계 문제를 JavaScript로 해결하는 방법을 알아보겠습니다. 반복문과 누적 곱(팩토리얼)을 활용하면 불필요한 중복 계산 없이 효율적으로 답을 구할 수 있습니다.


문제 이해

다음과 같은 수열이 주어져 있다고 가정해 보겠습니다.

수열: 1/1 , 1/(1×2) , 1/(1×2×3) , 1/(1×2×3×4) , …

이 수열의 n번째 항은 다음과 같습니다.

1 / (1 × 2 × 3 × … × n)

즉, 각 항은 그 순서 번호 n에 대한 팩토리얼(n!)의 역수입니다. 요구 사항은 숫자 n을 입력받아 이 수열의 첫 n항의 합을 반환하는 JavaScript 함수를 작성하는 것입니다.


접근 방법

매번 1부터 i까지 곱을 새로 계산하면 비효율적입니다. 대신 하나의 변수에 팩토리얼 값을 누적시키면서 각 항을 더하면 한 번의 반복으로 전체 합을 구할 수 있습니다. 시간 복잡도는 O(n)입니다.


예제 코드

const num = 12;

const seriesSum = (num = 1) => {
    let factorial = 1; // 현재 항의 분모 (i!)
    let sum = 0; // 수열의 합

    for (let i = 1; i <= num; i++) {
        factorial *= i; // i! 계산
        sum += 1 / factorial; // 현재 항을 합계에 추가
    }

    return sum;
};

console.log(seriesSum(num));

출력 결과

1.7182818282861684

코드 설명

- factorial 변수는 이전 단계에서 계산한 값에 현재 인덱스 i를 곱하는 방식으로 갱신되므로, i번째 항의 분모인 i!를 상수 시간에 얻을 수 있습니다.
- sum에는 각 항인 1/i!가 차례대로 더해집니다.
- 위 예제에서 num이 12일 때 결과는 약 1.7182818282...로, 자연상수 e에서 1을 뺀 값(e − 1 ≈ 1.7182818284...)에 매우 가깝습니다. 항의 개수를 늘릴수록 이 값에 수렴하게 됩니다.


마무리

이처럼 누적 곱 기법을 사용하면 팩토리얼 기반 수열의 합을 선형 시간 안에 깔끔하게 계산할 수 있습니다. 큰 n에 대해서는 JavaScript의 숫자 정밀도 한계(Number.MAX_VALUE, 약 170! 부터 무한대 처리)에 도달할 수 있으므로, 필요하다면 BigInt나 임의 정밀도 라이브러리를 고려하는 것이 좋습니다.