기능 계승 함수
정수에서 정수의 계승을 계산하는 방법은 무엇입니까?
가장 쉬운 방법 : math.factorial (x) (2.6 이상에서 사용 가능).
직접 쓰거나 쓰고있는 다음과 같은 것을 사용하십시오.
def factorial(n):return reduce(lambda x,y:x*y,[1]+range(1,n+1))
또는 더 읽기 쉬운 것 :
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
언제나 그렇듯이 Google은 친구입니다.)
Python 2.6 이상에서는 다음을 시도하십시오.
import math
math.factorial(n)
이것은 딱 필요한 것입니다. 그러나 여기에 while 루프를 사용하여 정수의 계승을 계산하는 또 다른 방법이 있습니다.
def factorial(n):
num = 1
while n >= 1:
num = num * n
n = n - 1
return num
기존 솔루션
가장 짧고 아마도 가장 빠른 해결책은 다음과 가능합니다.
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)
Python2.5 또는 이전 버전을 사용하는 경우
from operator import mul
def factorial(n):
return reduce(mul, range(1,n+1))
최신 Python의 경우 수학 모듈에 계승이 있고 여기에 다른 답변이 나와 있습니다.
for-loop를 사용하여 계승을 계산하는 또 다른 방법-
def factorial(n):
base = 1
for i in range(n,0,-1):
base = base * i
print base
네 말 뜻은 :
def fact(n):
f = 1
for i in range(1, n +1):
f *= i
return f
http://www.google.com/search?aq=0&oq=factorial+py&sourceid=chrome&ie=UTF-8&q=factorial+python
import math
math.factorial( yourInt )
성능상의 MIS 재귀를 사용하지 않습니다. 비참 할 것입니다.
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
여기 내 시도가 있습니다.
>>> import math
>>> def factorial_verbose(number):
... for i in range(number):
... yield f'{i + 1} x '
...
>>> res = ''.join([x for x in factorial_verbose(5)])
>>> res = ' '.join([res[:len(res)-3], '=', str(math.factorial(5))])
>>> res
'1 x 2 x 3 x 4 x 5 = 120'
def factorial(n):
result = 1
i = n * (n -1)
while n >= 1:
result = result * n
n = n - 1
return result
print (factorial(10)) #prints 3628800
나는 이것이 대답되었다는 것을 알고 있지만 여기에 역 범위 목록 이해력을 가진 또 다른 방법이있어 범위를 더 쉽게 읽고 더 간결하게 만듭니다.
# 1. Ensure input number is an integer by attempting to cast value to int
# 1a. To accomplish, we attempt to cast the input value to int() type and catch the TypeError/ValueError
# if the conversion cannot happen because the value type is incorrect
# 2. Create a list of all numbers from n to 1 to then be multiplied against each other
# using list comprehension and range loop in reverse order from highest number to smallest.
# 3. Use reduce to walk the list of integers and multiply each against the next.
# 3a. Here, reduce will call the registered lambda function for each element in the list.
# Reduce will execute lambda for the first 2 elements in the list, then the product is
# multiplied by the next element in the list, and so-on, until the list ends.
try :
num = int( num )
return reduce( lambda x, y: x * y, [n for n in range(num, 0, -1)] )
except ( TypeError, ValueError ) :
raise InvalidInputException ( "Input must be an integer, greater than 0!" )
이 요점 내에서 코드의 전체 버전을 볼 수 있습니다 : https://gist.github.com/sadmicrowave/d4fbefc124eb69027d7a3131526e8c06
한 줄, 빠르고 큰 숫자도 작동합니다.
#use python3.6.x for f-string
fact = lambda x: globals()["x"] if exec(f'x=1\nfor i in range(1, {x+1}):\n\tx*=i', globals()) is None else None
이러한 방법 중 상당수는 매우 훌륭하지만 항상 내장 기능을 사용하는 것이 최선의 방법이라고 생각합니다. 그러나 무슨 일이 일어나고 있는지보고 싶다면 혼자서 매우 쉽게 만들 수있는 것들이 있습니다. 내가 생각해 낸 빠른 것은 여기에있는 많은 사람들과 거의 동일합니다.
def factorial(n):
x = 1
li = list(range(1, n + 1))
for each in li:
x = x * each
print(x)
이것은 다소 효율적인 코드이며, 장점은 목록에서 일부 데이터를 조작하지 않으려는 경우 목록이 생성된다는 것입니다.
편집 : 단지 내가 오래된 것에 이것을 게시하는 것을 보았다. 죄송합니다.
이를 수행하는 또 다른 방법은 np.prod
아래와 같이 사용 하는 것입니다.
def factorial(n):
if n == 0:
return 1
else:
return np.prod(np.arange(1,n+1))
n!로 표시되는 양의 정수 n의 계승 은 n보다 작거나 같은 모든 양의 정수의 곱입니다.
공식 :n! = n * (n-1) * (n-2) * (n-3) * (n-4) * ....... * 1
내장 함수 / 라이브러리 등을 사용하여 파이썬에서 계승을 찾는 방법은 여러 가지가 있습니다. 여기서 계승의 기본 정의를 참조하여 사용자 정의 함수를 만들었습니다.
def factorial(n):
fact = 1
for i in range(1,n+1):
fact = fact * i
return(fact)
print(factorial(4))
또한 recursive
아래와 같은 기법을 사용하여 계승 함수를 구현할 수 있습니다 . 그러나이 방법은 작은 정수 값에만 효율적입니다. 재귀에서 함수는 반복적으로 호출되며 팩토리얼을 찾기 위해 큰 정수 값에 대해 효율적이거나 최적화 된 접근 방식이 아닌 스택을 유지하기 위해 메모리 공간이 필요합니다.
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
print(factorial(4))
def factorial(n):
mul = 1
for i in range( 1, n + 1):
mul *= i
print(factorial(6))
참고 URL : https://stackoverflow.com/questions/5136447/function-for-factorial-in-python
'IT' 카테고리의 다른 글
사용자가 ASP.NET MVC에서 HTML을 입력하도록 허용 -ValidateInput 또는 AllowHtml (0) | 2020.07.21 |
---|---|
처음으로 다섯 문자를 얻는 방법 (0) | 2020.07.21 |
완성 화 자바 펼쳐 양식 (프레임 워크 없음) (0) | 2020.07.21 |
Ruby 객체가 부울인지 확인하는 방법 (0) | 2020.07.21 |
변수를 2로 나눌 수 있는지 확인 (0) | 2020.07.21 |