데이터 분석이나 다양한 수학적 계산을 할 때 특정 숫자의 팩토리얼(factorial)을 구해야 하는 경우가 자주 발생합니다. 팩토리얼은 양의 정수 n에 대해 1부터 n까지의 모든 정수를 곱한 값으로, 예를 들어 5!는 5 × 4 × 3 × 2 × 1 = 120입니다.
파이썬에서 팩토리얼을 구하는 방법은 크게 세 가지가 있습니다. 각 방법의 원리와 장단점을 예제 코드와 함께 살펴보겠습니다.
1. for 반복문 사용하기
가장 기본적인 방법은 for 반복문을 활용하는 것입니다. 1부터 목표 숫자까지 차례로 반복하면서 매 단계마다 값을 곱해 나가면 됩니다.
아래 프로그램은 사용자에게 숫자를 입력받아 정수로 변환한 뒤 계산에 사용합니다. 이렇게 하면 입력값을 정수로 강제할 수 있어 계산 과정에서 오류를 줄일 수 있습니다.
예제 코드
n = input("Enter a number: ")
factorial = 1
if int(n) >= 1:
for i in range(1, int(n) + 1):
factorial = factorial * i
print("Factorial of", n, "is :", factorial)실행 결과
Enter a number: 5 Factorial of 5 is : 120
2. 재귀 함수(Recursion) 사용하기
두 번째 방법은 재귀 호출을 이용하는 것입니다. 팩토리얼은 수학적으로 n! = n × (n-1)!이라는 점화식으로 정의되므로, 함수가 자기 자신을 호출하는 재귀 구조와 잘 맞습니다.
재귀 함수 내부에서 입력값이 1보다 작으면 유효하지 않다는 의미로 "NA"를 반환하도록 처리하여, 음수 입력 같은 비정상적인 경우도 대응할 수 있습니다.
예제 코드
num = input("Enter a number: ")
def recur_factorial(n):
if n == 1:
return n
elif n < 1:
return "NA"
else:
return n * recur_factorial(n - 1)
print(recur_factorial(int(num)))실행 결과
#Run1: Enter a number: 5 120 #Run2: Enter a number: -2 NA
위 실행 결과에서 볼 수 있듯이, 정상적인 양의 정수가 입력되면 팩토리얼 값을 반환하고 음수가 입력되면 "NA"를 출력합니다.
3. math.factorial() 함수 사용하기
가장 간단하고 안전한 방법은 파이썬 표준 라이브러리인 math 모듈에 내장된 factorial() 함수를 직접 사용하는 것입니다. 별도의 로직을 구현할 필요 없이 한 줄로 결과를 얻을 수 있으며, 음수나 소수 입력에 대한 처리도 모듈 내부에서 검증해 줍니다.
예제 코드
import math
num = input("Enter a number: ")
print("The factorial of", num, "is :")
print(math.factorial(int(num)))실행 결과
#Run1: Enter a number: 5 The factorial of 5 is : 120 #Run2: Enter a number: 3.6 Traceback (most recent call last): The factorial of 3.6 is : File "C:/Users....py", line 5, in <module> print(math.factorial(int(num))) ValueError: invalid literal for int() with base 10: '3.6'
소수(예: 3.6)가 입력되면 int() 변환 단계에서 ValueError가 발생하는 것을 확인할 수 있습니다. 따라서 실무에서는 입력값 검증 로직을 함께 두거나 try-except 문으로 예외를 처리하는 것이 좋습니다.
세 가지 방법 비교 및 정리
- for 반복문: 알고리즘 동작 원리를 이해하기 좋고 초보자에게 적합하지만, 코드가 상대적으로 길어집니다.
- 재귀 함수: 수학적 정의를 그대로 옮긴 우아한 방식이지만, 숫자가 커지면 재귀 깊이 제한(기본 1000회)에 걸릴 수 있습니다.
- math.factorial(): C로 구현되어 가장 빠르고 안정적입니다. 실무 환경에서는 이 방법을 사용하는 것을 권장합니다.
학습 목적이라면 반복문과 재귀 방식으로 직접 구현해 보며 개념을 익히고, 실제 프로젝트에서는 math.factorial()을 활용하는 것이 효율적입니다.