Как мне вычислить факториал целого в Python?
Функция для Factorial в Python
Ответ 1
Самый простой способ: 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 - ваш друг;)
Ответ 2
В Python 2.6 и выше попробуйте:
import math
math.factorial(n)
Ответ 3
Не обязательно, так как это такой старый поток. Но я сделал здесь еще один способ вычислить факториал целого числа, используя цикл while.
def factorial(n):
num = 1
while n >= 1:
num = num * n
n = n - 1
return num
Ответ 4
Существующее решение
Самое короткое и, вероятно, самое быстрое решение:
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)
Ответ 5
def factorial(n):
if n < 2:
return 1
return n * factorial(n - 1)
Ответ 6
Если вы используете Python2.5 или старше, попробуйте
from operator import mul
def factorial(n):
return reduce(mul, range(1,n+1))
для нового Python, в математическом модуле есть факториал, как указано в других ответах здесь.
Ответ 7
Еще один метод вычисления факториала с использованием цикла for-loop -
def factorial(n):
base = 1
for i in range(n,0,-1):
base = base * i
print base
Ответ 8
Вы имеете в виду:
def fact(n):
f = 1
for i in range(1, n +1):
f *= i
return f
Ответ 9
http://www.google.com/search?aq=0&oq=factorial+py&sourceid=chrome&ie=UTF-8&q=factorial+python
import math
math.factorial( yourInt )
Ответ 10
Из соображений производительности, пожалуйста, не используйте рекурсию. Это было бы катастрофично.
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
Ответ 11
Вот моя попытка
>>> 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'
Ответ 12
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
Ответ 13
Я знаю, что на этот вопрос ответили, но вот еще один метод с пониманием обратного списка диапазонов, делающий диапазон более легким для чтения и более компактным:
# 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
Ответ 14
Также работает одна строка, быстрые и большие числа:
#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
Ответ 15
Многие из этих методов очень хороши, но я бы сказал, что ваш лучший выбор - всегда использовать встроенную функцию. Однако есть очень легко создаваемые, если вы хотите увидеть, что происходит. Быстрый, который я придумал, почти так же, как и многие из них здесь.
def factorial(n):
x = 1
li = list(range(1, n + 1))
for each in li:
x = x * each
print(x)
Это довольно эффективный код, преимущество в том, что список создается, если вы не будете манипулировать некоторыми данными из списка, хотя я не уверен, почему вы действительно это делаете.
Изменить: только что увидел, что я разместил это на старой вещи. К сожалению.
Ответ 16
Другой способ сделать это - использовать np.prod
показанный ниже:
def factorial(n):
if n == 0:
return 1
else:
return np.prod(np.arange(1,n+1))
Ответ 17
Факториал целого положительного числа n, обозначаемого через n !, является произведением всех натуральных чисел, меньших или равных n.
Формула: n! = n * (n-1) * (n-2) * (n-3) * (n-4) * ....... * 1
Есть несколько способов найти факториал в python с помощью встроенной функции/библиотеки и т.д. Здесь я создал пользовательскую функцию со ссылкой на базовое определение факториала.
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))
Ответ 18
def factorial(n):
mul = 1
for i in range( 1, n + 1):
mul *= i
print(factorial(6))
Ответ 19
#use this code
print("welcome to factoral program")
factor = int(input("enter the number you want factors for"))
factors = []
while factor > 0:
factors.append(factor)
factor -= 1
print(factors)