<개인공부>/[Python]

[python] 파이썬 팩토리얼(factorial) 구하기 3가지 방법

사용자 BlockDMask 2021. 5. 27. 00:30
반응형

안녕하세요. BlockDMask입니다.
오늘은 파이썬에서 팩토리얼을 구하는 3가지 방법에 대해서 이야기해보려 합니다.

<목차>
1. 재귀를 이용한 팩토리얼
2. 반복을 이용한 팩토리얼
3. math.factorial 함수를 이용한 팩토리얼

 

1. 파이썬 팩토리얼 재귀


재귀 함수를 이용해서 팩토리얼을 구할 수 있습니다.

일단 팩토리얼을 간단하게 보면 팩토리얼은 자기를 포함해서 하나씩 작은 수를 곱해가면서 1까지 곱해나가는 것을 말합니다.
0! = 1
1! = 1이고

3! 은 3 * 2 * 1입니다.
그렇기 때문에 N! 은 N * (N-1) * (N-2) *.... 3 * 2 * 1입니다.
자세히 보면 N을 곱하고 N에서 하나 뺀 값을 곱하고 그 N에서 하나 뺀 값에서 하나 더 빼서 곱하고.. 이런 식이죠?

이걸 재귀로 만들게 되면 아래와 같습니다.
N > 1 큰 경우에는 N을 곱하고, 그 후에 N에서 값을 하나씩 빼주면서 다시 함수를 호출해서 곱하도록 하고 
N <=1 인 경우 빠져나오게 하면 됩니다.

def factorial_recursion(n):
    if n > 1:
        return n * factorial_recursion(n-1)
    else:
        return 1


result0 = factorial_recursion(0)  # 0! = 1
result1 = factorial_recursion(1)  # 1! = 1
result2 = factorial_recursion(2)  # 2! = 2 * 1
result3 = factorial_recursion(3)  # 3! = 3 * 2 * 1
result4 = factorial_recursion(4)  # 4! = 4 * 3 * 2 * 1
result5 = factorial_recursion(5)  # 5! = 5 * 4 * 3 * 2 * 1

print(f'factorial(0) : {result0}')
print(f'factorial(1) : {result1}')
print(f'factorial(2) : {result2}')
print(f'factorial(3) : {result3}')
print(f'factorial(4) : {result4}')
print(f'factorial(5) : {result5}')

이렇게 재귀를 이용해서 팩토리얼을 만들 수 있습니다. 

재귀가 헷갈리는 분들을 위해서 3을 넣은 것을 한번 차례대로 풀어보겠습니다.
factorial_recursion(3)을 호출하게 되면 
3 > 1 이기 때문에 3 * factorial_recursion(3 - 1) 이렇게 불리게 됩니다. 
2 > 1 이기 때문에 3 * 2 * factorial_recursion(2 - 1) 이렇게 불리겠죠? 
1 > 1 이 성립하지 않으니 else로 가서 return 1이 됩니다.
그럼 총 식이 3 * 2 * 1 이렇게 되어서 팩토리얼 값이 나오게 됩니다.

 

 

2. 파이썬 팩토리얼 반복


반복문을 통해서도 팩토리얼을 만들 수 있는데요.

N! 은 N * (N-1) * (N-2)... 3 * 2 * 1인데 이걸 거꾸로 보면 
N! 은 1 * 2 * 3 *... (N-2) * (N-1) * N입니다. 즉, 1부터 계속해서 N까지 증가하면서 곱하는 것입니다.
이 성질을 이용해서 반복문을 통해서 구하면 됩니다.

이것은 파이썬에서 range를 이용하면 쉽습니다. 1~N 까지를 나타내려면 range(1, N+1)으로 범위를 편하게 나타낼 수 있기 때문에 
range 함수와 for 반복문을 합치게 되면 손쉽게 반복문을 통해서 팩토리얼을 구현할 수 있습니다.

아래 코드를 보시죠.

def factorial_range(n):
    result = 1
    for val in range(1, n + 1):  # 1 ~ n 까지
        result *= val
    return result


result0 = factorial_range(0)  # 0! = 1
result1 = factorial_range(1)  # 1! = 1
result2 = factorial_range(2)  # 2! = 1 * 2
result3 = factorial_range(3)  # 3! = 1 * 2 * 3
result4 = factorial_range(4)  # 4! = 1 * 2 * 3 * 4
result5 = factorial_range(5)  # 5! = 1 * 2 * 3 * 4 * 5

print(f'factorial(0) : {result0}')
print(f'factorial(1) : {result1}')
print(f'factorial(2) : {result2}')
print(f'factorial(3) : {result3}')
print(f'factorial(4) : {result4}')
print(f'factorial(5) : {result5}')

range와 for 반복문을 이용해서 factorial 값을 구해보았습니다.
재귀는 뒤에서부터 N , N -1 , N-2.... 3, 2, 1이라고 한다면
반복문은 앞에서부터 1, 2, 3,... N-2, N-1, N 까지를 곱한다고 생각하면 이해하기 편할 것 같습니다.

물론 반복문도 N에서부터 1까지 거꾸로 구할 수 있고, 재귀도 1부터 N까지 구할 수 있습니다.
하지만, 제가 본 대부분의 경우 위와 같은 방식으로 구했습니다.

 

 

3. 파이썬 math.factorial 함수


이 파이썬에서는 또(?) 만들어놨네요. 
제가 경험했던 언어에서는 없던 함수를 이렇게 또.. 편하게 이용하라고 만들어놓은 파이썬..........

파이썬의 math 라이브러리에 factorial 함수가 이미 있습니다.
우리는 위에 1번 2번에서 배웠던 재귀, 반복을 통해서 머리 써가면서(?) 팩토리얼을 구현했는데, 
실전에서는 그냥 이 함수를 가져다가 쓰면 됩니다.

라이브러리 : math

함수 사용 : math.factorial(n)
입력 : 구하고자 하는 팩토리얼 n의 값을 입력합니다.
반환 : n! 결괏값을 정수로 반환합니다,

주의 : n 이 0보다 작은 음수인 경우 error를 반환합니다.
주의 : n은 정수이어야 합니다. 실수 입력 시 error 반환. (3.9부터 math.factorial(5.0) 이런 것도 금지됨)

이렇게 편하게 함수로 만들어 두었습니다.

import math

result0 = math.factorial(0)
result1 = math.factorial(1)
result2 = math.factorial(2)
result3 = math.factorial(3)
result4 = math.factorial(4)
result5 = math.factorial(5)

print(f'math.factorial(0) : {result0}')
print(f'math.factorial(1) : {result1}')
print(f'math.factorial(2) : {result2}')
print(f'math.factorial(3) : {result3}')
print(f'math.factorial(4) : {result4}')
print(f'math.factorial(5) : {result5}')

import math를 통해서 math 라이브러리를 임포트하고
그 후에 math.factorial (N)에 숫자만 집어넣으면 알아서 팩토리얼이 구해집니다.
엄청... 편하군요... 신세계....

 

 

이미 만들어진 함수를 이용해서 빠르게 구현하도록 하는 걸 추천합니다.
그렇지만, 팩토리얼에 대한 학습이 목적이시라면 재귀와 반복으로 구하는 방법을 알아두시면 좋을듯합니다.
감사합니다. 이상으로 파이썬에서 팩토리얼을 구하는 방법 3가지 (재귀, 반복, 함수)에 대해서 알아보았습니다.

반응형