Как мне вычислить факториал целого числа в Python?
135
Самый простой способ - использовать 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
или рекурсивный подход:
def factorial(n):
if n < 2:
return 1
else:
return n * factorial(n-1)
Обратите внимание, что функция факториала определена только для натуральных чисел, поэтому вы должны также проверить это n >= 0
и это isinstance(n, int)
. Если это не так, поднимите ValueError
или TypeError
соответственно. math.factorial
позабочусь об этом за вас.
factorial
вfactorial
функции. Как вы можете использовать ту же функцию в функции, которую вы сейчас определяете? Я новичок в Python, поэтому я просто пытаюсь понять.RecursionError
для любого числа больше 998 (попробуйтеfactorial(999)
), если вы не увеличите предел рекурсии PythonНа Python 2.6 и выше попробуйте:
источник
float
в эту функцию вызовет aDeprecationWarning
. Если вы хотите сделать это, вам нужно преобразоватьn
вint
явно:,math.factorial(int(n))
который будет отбрасывать что-либо после десятичной дроби, так что вы можете проверить этоn.is_integer()
Не действительно необходимо, так как это такая старая тема. Но я сделал здесь еще один способ вычислить факториал целого числа, используя цикл while.
источник
num = num * n
положение строки с помощьюn = n - 1
и запускаю этоfor i in range(1, 5): print('Factorial of', i, 'is', factorial(i))
для каждого факториала, вывод равен 0. Я хотел бы знать обоснование, почемуnum = num * n
должен стоять первым. Спасибо!!Существующее решение
Самое короткое и, вероятно, самое быстрое решение:
Создай свой
Вы также можете создать собственное решение. Обычно у вас есть два подхода. Тот, который подходит мне лучше всего:
(это работает также для больших чисел, когда результат становится
long
)Второй способ достижения того же:
источник
источник
factorial(999)
(и выше) повысит,RuntimeError
если вы не увеличите лимит рекурсии PythonЕсли вы используете Python2.5 или старше, попробуйте
для более нового Python есть факториал в математическом модуле, как указано в других ответах здесь
источник
reduce
удален из Python 3.from functools import reduce
источник
Используя
for
-loop, считая отn
:источник
Из соображений производительности, пожалуйста, не используйте рекурсию. Это было бы катастрофично.
Проверьте результаты бега
Использование стека удобно (например, рекурсивный вызов), но оно обходится дорого: хранение подробной информации может занимать много памяти.
Если стек высок, это означает, что компьютер хранит много информации о вызовах функций.
Метод занимает только постоянную память (как итерация).
Или Использование для цикла
Проверьте результаты бега
Или используя встроенную функцию математики
Проверьте результаты бега
источник
источник
Вот моя попытка
источник
Также работает одна строка, быстрые и большие числа:
источник
Я знаю, что на этот вопрос ответили, но вот еще один метод с пониманием обратного списка диапазонов, который делает диапазон более легким для чтения и более компактным:
Вы можете увидеть полную версию кода в этом списке: https://gist.github.com/sadmicrowave/d4fbefc124eb69027d7a3131526e8c06
источник
[n for n in range(num, 0, -1)]
,range
уже итеративный.Другой способ сделать это - использовать
np.prod
показанное ниже:источник
Факториал положительного целого числа n, обозначенного через n !, является произведением всех натуральных чисел, меньших или равных n.
Формула :
n! = n * (n-1) * (n-2) * (n-3) * (n-4) * ....... * 1
Есть несколько способов найти факториал в Python с помощью встроенной функции / библиотеки и т. Д. Здесь я создал пользовательскую функцию со ссылкой на базовое определение факториала.
Мы также можем реализовать функцию факториала, используя
recursive
технику, как показано ниже. Но этот метод эффективен только для небольших целочисленных значений. Поскольку в рекурсии функция вызывается повторно и требует места в памяти для поддержки стека, что не является эффективным или оптимизированным подходом для больших целочисленных значений для поиска факториала.источник
источник
В приведенном ниже коде я беру ввод числа, чей факториал я хочу вычислить. После этого я умножаю число ->, чей факториал мы хотим вычислить, на числа, начинающиеся с 1,2, ...., (число, чей факториал Хочу посчитать -1)
источник