팩토리얼은 계승이라는 뜻으로 해당하는 자연수까지의 곱에 대한 결과값을 말한다.
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가 최종 리턴된다.
'기초지식 > 컴퓨터 공학' 카테고리의 다른 글
CPU 와 메모리의 관계 (0) | 2019.04.15 |
---|---|
내가 이해한 DNS (0) | 2019.02.23 |
32비트 컴퓨터가 16GB 의 메모리까지만 허용하는 이유 (0) | 2018.12.24 |
동기 처리와 비동기 처리 (0) | 2018.12.24 |