programing

Python의 요인 함수

oldcodes 2023. 7. 3. 23:09
반응형

Python의 요인 함수

파이썬에서 정수의 인수를 계산하려면 어떻게 해야 합니까?

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

import math
math.factorial(1000)

직접 작성해야 하는 경우 다음과 같은 반복적인 방법을 사용할 수 있습니다.

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

또는 재귀적 접근법:

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

요인 함수는 양의 정수에 대해서만 정의되므로 다음 사항도 확인해야 합니다.n >= 0그리고 그거. 아니면 a, a를 각각 올려주세요. math.factorial당신을 위해 이 일을 처리할 것입니다.

Python 2.6 이상에서는 다음을 시도해 보십시오.

import math
math.factorial(n)

기존 솔루션

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

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)
def factorial(n):
    if n < 2:
        return 1
    return n * factorial(n - 1)

성능상의 이유로 재귀를 사용하지 마십시오.그것은 재앙이 될 것입니다.

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

스택을 사용하는 것은 (재귀 호출과 같이) 편리하지만, 자세한 정보를 저장하는 데는 많은 메모리가 필요합니다.

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

메소드는 반복과 같은 일정한 메모리만 사용합니다.

또는 'for' 루프 사용

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

Python 2.5 이상을 사용하는 경우 사용해 보십시오.

from operator import mul

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

최신 버전의 Python의 경우 여기에 있는 다른 답변에 나와 있는 것처럼 수학 모듈에 요인이 있습니다.

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

또 다른 방법은 사용하는 것입니다.np.prod아래 표시:

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

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

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

마음에 들면 한 줄로 재귀적으로 만들 수도 있습니다.그것은 단지 개인적인 선택의 문제입니다.여기서는 인라인을 사용합니다.if else파이썬에서 자바의 삼원 연산자와 유사합니다.

Expression1 ? Expression2 : Expression3
  • 한 줄function call접근:

    def factorial(n): return 1 if n == 0 else n * factorial(n-1)
    
  • 한 줄lambda함수 접근 방식:

    람다 함수를 이름에 직접 할당하는 것은 권장되지 않습니다. 람다 함수는 잘못된 관행으로 간주되고 코드에 일관성이 없을 수 있기 때문입니다.항상 알게 되어 기쁩니다.PEP8 참조).

    factorial = lambda n: 1 if n == 0 else n * factorial(n-1)
    

언급URL : https://stackoverflow.com/questions/5136447/function-for-factorial-in-python

반응형