Подтвердить что ты не робот

Функция для Factorial в Python

Как мне вычислить факториал целого в Python?

4b9b3361

Ответ 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

Ответ 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)