본문으로 바로가기

factorial 에 대해서 이해해보기

category 기초지식/컴퓨터 공학 2018. 12. 28. 20:00

팩토리얼은 계승이라는 뜻으로 해당하는 자연수까지의 곱에 대한 결과값을 말한다.



3! 팩토리얼에 대한 과정 및 결과값



1
2
3
4
3!
 
# 1 x 2 x 3
>> 6
cs



팩토리얼 코드


1
2
3
4
def factorial(n):
    if n <= 1:
        return 1
    return n * factorial(n-1)
cs




팩토리얼 코드에 대한 스택프레임과 리턴 되는 값이 어떻게 곱해지는지에 대한 설명 및 그림첨부


1) factorial(4)factorial(n - 1 )에 걸려서 스택프레임에 쌓이며 값이 factorial(4 -1) 로 자기 자신을 다시 호출하여 def factorial(3) 으로 다시 진입한다.

또한 리턴되지 않았기 때문에 스택프레임에 쌓인다.


2) 이하 factorial(1)까지 동일한 과정을 거치게 되며, factorial(1) 은 n <= 1 식에서 1 == 1의 상태이기 때문에 return 은 1이 된다.


3) 스택프레임이 4, 3, 2, 1 순으로 쌓이며 1 에 대한 탈출조건이 성립되었기 때문에 첫번째 리턴문으로 탈출하며 이제부터는 두번째 리턴만을 순회한다.


4) factorial(1) 에 대한 결과값은 1이며, return 되어 스택프레임에 쌓인 factorial(2) 가 실행된다.

factorial(2) 는 return 2 * factorial(2-1) 에 대한 결과값을 리턴하게 된다.

즉, return 2 * factorial(2-1) = 2 를 리턴한다.

이를 다른식으로 풀면 return 2 * factorial(1) 에서 factorial(1) 을 리턴한 결과값과 인자로 들어온 n=2 를 곱한 것과 같다.


5) factorial(3) 은 return 3 * factorial(3-1) 에 대한 결과값을 리턴하게 된다.


6) 이 역시도 return 3 * factorial(3-1) = 2를 리턴한다.

여기서 눈치챘겠지만 factorial(3-1) 은 factorial(2) 에서 리턴된 값을 의미한다.


7) 결과값은 3 * factorial(2) = 6을 리턴한다.


8) factorial(4) 는 return 4 * factorial(4-1) 을 리턴한다.

즉, 4 * factorial(3) 에서 factorial(3) 의 return 값과 n = 4 를 곱해주면 리턴이 끝나며 종료된다.



결과값은 4 * factorial(3) = 4 와 factorial(3) 함수에 리턴된 결과값 6을 곱하여 4 * 6 = 24가 최종 리턴된다.