본문 바로가기
Algorithm/인프런 알고리즘 강의

[Algorithm] 팩토리얼

by jojo 2022. 10. 14.

❐ 팩토리얼

▶︎ 문제

   자연수 N을 입력하면 N!값을 구하세요.

   N! = n*(n-1)*(n-2)*....*2*1 입니다.

   자연수 N이 입력됩니다. 

 

▷ 입력 예제

5

 

▶︎ 출력 예제

120

 

▷ 문제설명

팩토리얼을 구현하는 방법은 다양할 것이다. 이번 포스팅에서는 두 가지 방법을 소개하겠다.

 

- 첫번째 방법

function solution(n) {
    let answer = 1;
    function DFS(N) {
        if (N === 1) {
            return;
        } else {
            answer = answer * N;
            DFS(N - 1);
        }
    }
    DFS(n);
    return answer;
}

console.log(solution(5));

D(5)부터 시작해 D(4), D(3) ..... D(1)이 될때까지 호출을 계속한다. 이때 변수 answer을 두고 N 값을 계속해서 곱한다. 

N이 1이 되는 조건이 성립이 되면 마지막으로 호출된 DFS(1) 함수를 return으로 종료한다. 최종적으로 solution 함수는 answer를 return 하면서 우리가 원하는 값을 출력할 수 있다. 

 

- 두번째 방법

function solution(n) {
    let answer;
    function DFS(N) {
        if (N === 1) {
            return 1;
        } else {
            return N * DFS(N - 1);
        }
    }
    answer = DFS(n);
    return answer;
}

console.log(solution(5));

변수 answer에는 DFS(5)를 실행하는 값이 담긴다. DFS 함수는 특정 값을 return 하는데 N이 1인 경우에는 1을 return 하고 그렇지 않는 경우에는 N*DFS(N-1)를 return하게 된다. 이것이 D(1)에 이를 때까지 연쇄적으로 반복된다. 

그림으로 나타내면 다음과 같다. 

 

개인적으로 의문이 들었던 부분은 '왜 answer 변수에 값을 담아서 return 해야하는가' 하는 것이었다. 실제로 answer 변수를 사용하지 않고 코드를 짜면 우리가 원하는 값이 출력되지 않고 console창에는 undefined만 출력된다. 

// 잘못된 코드
function solution(n) {
    function DFS(N) {
        if (N === 1) {
            return 1;
        } else {
            return N * DFS(N - 1);
        }
    }
    DFS(n);
}

console.log(solution(5));

하지만 이것은 굉장히 당연한 결과이다. 우리가 console.log로 출력하고자 하는 것은 solution(5)의 값이기 때문이다. 다시 말해 solution 함수 단에서 return한 값이 console 창에 찍히는 값이 된다. DFS 함수는 solution안에 중첩되어있는 함수일 뿐이라는 것을 잊어서는 안된다!

 

 

댓글