개발/Python

Python의 팩토리얼 함수

MinorMan 2021. 1. 13. 06:09
반응형

<질문>

파이썬에서 정수의 계승을 어떻게 계산합니까?


<답변1>

가장 쉬운 방법은 사용하는 것입니다math.factorial(Python 2.6 이상에서 사용 가능) :

import math
math.factorial(1000)

직접 작성하거나 작성해야하는 경우 반복적 인 접근 방식을 사용할 수 있습니다.

def factorial(n):
    fact = 1
    for num in range(2, n + 1):
        fact *= num
    return fact

또는recursive접근하다:

def factorial(n):
    if n < 2:
        return 1
    else:
        return n * factorial(n-1)

참고factorial function양의 정수에 대해서만 정의되므로 다음 사항도 확인해야합니다.n >= 0그리고 그isinstance(n, int). 그렇지 않은 경우ValueError또는TypeError각기.math.factorial당신을 위해 이것을 처리 할 것입니다.


<답변2>

Python 2.6 이상에서 다음을 시도하십시오.

import math
math.factorial(n)

<답변3>

가장 짧고 아마도 가장 빠른 솔루션은 다음과 같습니다.

from math import factorial
print factorial(1000)

자신 만의 솔루션을 구축 할 수도 있습니다. 일반적으로 두 가지 접근 방식이 있습니다. 나에게 가장 적합한 것은 :

from itertools import imap
def factorial(x):
    return reduce(long.__mul__, imap(long, xrange(1, x + 1)))

print factorial(1000)

(결과가 될 때 더 큰 숫자에서도 작동합니다.long)

두 번째 방법은 다음과 같습니다.

def factorial(x):
    result = 1
    for i in xrange(2, x + 1):
        result *= i
    return result

print factorial(1000)

<답변4>

def factorial(n):
    if n < 2:
        return 1
    return n * factorial(n - 1)

<답변5>

Python2.5 또는 이전 버전을 사용하는 경우

from operator import mul
def factorial(n):
    return reduce(mul, range(1,n+1))

최신 Python의 경우 여기에 다른 답변에 제공된 것처럼 수학 모듈에 계승이 있습니다.


<답변6>

def fact(n):
    f = 1
    for i in range(1, n + 1):
        f *= i
    return f

<답변7>

def fact(n, total=1):
    while True:
        if n == 1:
            return total
        n, total = n - 1, total * n
cProfile.run('fact(126000)')
4 function calls in 5.164 seconds

스택을 사용하는 것은 편리하지만 (재귀 호출처럼) 비용이 발생합니다. 세부 정보를 저장하면 많은 메모리를 차지할 수 있습니다.

스택이 높으면 컴퓨터가 함수 호출에 대한 많은 정보를 저장한다는 것을 의미합니다.

이 메서드는 반복과 같이 일정한 메모리 만 차지합니다.

def fact(n):
    result = 1
    for i in range(2, n + 1):
        result *= i
    return result
cProfile.run('fact(126000)')
4 function calls in 4.708 seconds
def fact(n):
    return math.factorial(n)
cProfile.run('fact(126000)')
5 function calls in 0.272 seconds

<답변8>

이를 수행하는 또 다른 방법은np.prod아래에 표시 :

def factorial(n):
    if n == 0:
        return 1
    else:
         return np.prod(np.arange(1,n+1))

<답변9>

비 재귀 솔루션, 가져 오기 없음 :

def factorial(x):
    return eval(' * '.join(map(str, range(1, x + 1))))
반응형