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

JavaScript 재귀 함수로 합산 후 자릿수 곱 구하기

이번 글에서는 임의 개수의 숫자 인자를 받아 모두 더한 뒤, 그 결과가 한 자리 숫자가 될 때까지 각 자릿수를 계속 곱하는 JavaScript 함수를 만들어 보겠습니다.

문제 이해하기

예를 들어 인자가 다음과 같이 주어졌다고 가정해 보겠습니다.

16, 34, 42

먼저 세 숫자를 모두 더합니다.

16 + 34 + 42 = 92

그다음 결과값이 한 자리 숫자가 될 때까지 자릿수끼리 곱을 반복합니다.

9 * 2 = 18
1 * 8 = 8

최종적으로 한 자리 숫자인 8에 도달하면, 함수는 이 값을 반환하면 됩니다.

풀이 접근 방식

이 문제는 두 개의 함수로 나누어 해결할 수 있습니다.

  • product() 함수: 하나의 숫자를 받아 각 자릿수의 곱을 재귀적으로 계산하여 반환합니다.

  • 재귀 호출부: product() 함수를 반복적으로 호출하면서 결과가 한 자리 숫자가 되었는지 확인하고, 한 자리가 되면 그 값을 반환하고 그렇지 않으면 계속 반복합니다.

구현 코드

전체 기능을 구현한 코드는 다음과 같습니다.

예제

const recursiveMuliSum = (...numbers) => {
    const add = (a) => a.length === 1 ? a[0] : a.reduce((acc, val) => acc+val);
    const produce = (n, p = 1) => {
        if(n){
            return produce(Math.floor(n/10), p*(n%10));
        };
        return p;
    };
    const res = produce(add(numbers));
    if(res > 9){
        return recursiveMuliSum(res);
    }
    return res;
};
console.log(recursiveMuliSum(16, 28));
console.log(recursiveMuliSum(16, 28, 44, 76, 11));
console.log(recursiveMuliSum(1, 2, 4, 6, 8));

코드 설명

add 함수는 전달받은 배열의 요소가 하나뿐이라면 그 값을 그대로 반환하고, 여러 개라면 reduce() 메서드로 모든 값을 더합니다. produce 함수는 재귀를 활용해 숫자의 마지막 자릿수(n % 10)를 누적 곱(p)에 곱해 나가고, n이 0이 되면 최종 곱을 반환합니다. 마지막으로 결과가 9보다 크면 recursiveMuliSum을 다시 호출해 과정을 반복하고, 한 자리 숫자가 나오면 그대로 반환합니다.

실행 결과

콘솔 출력 결과는 다음과 같습니다.

6
5
2