Как сделать факториал в питоне

Обновлено: 04.07.2024

Программа принимает на вход число и вычисляет факториал этого числа с использованием рекурсивного алгоритма.

Решение задачи

  1. Записываем введенное пользователем число в отдельную переменную.
  2. Передаем это число в качестве аргумента в рекурсивную функцию, которая вычисляет факториал.
  3. Определяем внутри этой функции базовое условие рекурсии: в случае, когда аргумент функции меньше либо равен 1 , рекурсивная функция прекращает свою работу и возвращает в качестве результата 1 .
  4. В противном случае в качестве результата возвращается число, умноженное на рекурсивную функцию, аргумент которой уменьшен на единицу. И все повторяется заново.
  5. После того, как рекурсивная функция прекратила свою работу, на экран выводится результат.
  6. Конец.

Исходный код

Ниже дан исходный код, который осуществляет нахождение факториала числа при помощи рекурсии. Результаты работы программы также даны ниже.

Объяснение работы программы

  1. Пользователь вводит число и оно записывается в переменную n .
  2. Передаем число n в качестве аргумента в рекурсивную функцию, которая вычисляет факториал этого числа.
  3. Задаем базу рекурсии при помощи условия n . Если оно выполняется, рекурсивная функция возвращает 1 и ее работа останавливается.
  4. В противном случае функция возвращает n * factorial(n-1) и все повторяется заново.
  5. После того, как функция завершит свою работу, результат выводится на экран.

Результаты работы программы

Лаборатория Django-разработки

За 3 месяца отработай навыки Django-разработки до профессионального уровня на серьезном проекте под руководством наставника.

В Python математический модуль содержит ряд математических операций, которые можно легко выполнить с помощью модуля. math.factorial() возвращает факториал нужного числа.

Код № 1:

print ( "The factorial of 5 is : " , end = "")

Код № 2:

print ( "The factorial of 5 is : " , math.factorial(x))

print ( "The factorial of 15 is : " , math.factorial(y))

print ( "The factorial of 8 is : " , math.factorial(z))

Выход:

Код № 3: Выдает ValueError, если x не является целым числом

По определению, факториал – это произведение положительного целого числа и всех положительных целых чисел, которые меньше или равны данному числу. Другими словами, получение факториала числа означает умножение всех целых чисел от этого числа вплоть до 1.

Факториал – это целое число, за которым следует восклицательный знак.

5! обозначает факториал из пяти.

Чтобы вычислить факториал, мы умножаем число на каждое целое число, меньшее его, пока не дойдём до 1:

Запомните эти простые правила, ведь в этом уроке мы узнаем, как вычислять факториал целого числа с помощью Python, используя циклы и рекурсию. Начнём с вычисления факториала с помощью циклов.

Вычисляем факториал с помощью циклов

Мы можем вычислять факториалы, используя как цикл while , так и цикл for . Общий процесс довольно похож в обоих случаях. Всё, что нам нужно, – это параметр в качестве входных данных и счетчик.

Давайте начнем с цикла for :

Возможно, вы заметили, что мы считаем, начиная с 1 до n-числа , в то время как в определении мы описали факториал, как произведение положительного целого числа и всех положительных целых чисел до 1. Но по законам математики:


Проще говоря, (n – (n-1)) всегда равно 1.

Это значит, что не важно, в каком направлении мы считаем. Можем начать с 1 и увеличиваться в направлении n-числа , или он может начинаться с n-числа и уменьшаться в направлении 1. Теперь, когда мы всё объяснили, начнём разбирать функцию, о которой говорили.

Наша функция принимает параметр n , который обозначает число, для которого мы вычисляем факториал. Сначала мы определяем переменную с именем result и присваиваем ей значение 1 .

Вы можете спросить, почему 1, а не 0?

Потому что если бы мы присвоили ему 0, то все последующие умножения на 0, естественно, привели бы к 0.

Затем мы начинаем наш цикл for в диапазоне от 1 до n+1 . Помните, что диапазон Python остановится перед вторым аргументом. Чтобы включить и последнее число, мы просто добавляем еще 1 .

Внутри цикла for мы умножаем текущее значение result на текущее значение вашего индекса i .

Наконец, мы возвращаем конечное значение result . Давайте протестируем нашу функцию и выведем результат:

Программа предложит пользователю ввести данные. Мы попробуем с 4 :

Можете проверить результат на калькуляторе:

4! = 4 * 3 * 2 * 1 = 24.

Теперь давайте посмотрим, как мы можем вычислить факториал, используя цикл while . Вот наша модифицированная функция:

Это очень похоже на цикл for . Только в этот раз, мы движемся от n к 1, что ближе к математическому определению. Протестируем нашу функцию:

Хотя считали наоборот, результат получился тот же.

Рассчитывать факториал с помощью цикла легко. Теперь посмотрим, как вычислить факториал с помощью рекурсивной функции.

Вычисляем факториал с помощью рекурсивной функции

Рекурсивная функция – это функция, которая вызывает саму себя. Определение кажется страшным, но потерпите, и вы поймёте, что это значит.

Обычно каждая рекурсивная функция состоит из двух основных компонентов: базового варианта и рекурсивного шага.

Базовые случаи – это самые маленькие примеры задачи. Также это перерыв, случай, который вернет значение и выйдет из рекурсии. С точки зрения факторных функций, базовый случай – это когда мы возвращаем конечный элемент факториала, который равен 1.

Без базового случая или с неправильным базовым случаем ваша рекурсивная функция может выполняться бесконечно, вызывая переполнение.

Рекурсивные шаги, как следует из названия, являются рекурсивной частью функции, где вся задача преобразуется в нечто меньшее. Если рекурсивный шаг не позволяет уменьшить задачу, то рекурсия опять-таки может выполняться бесконечно.

Рассмотрим повторяющуюся часть факториалов:

5! = 5 * 4 * 3 * 2 * 1

Также мы знаем, что:

4 * 3 * 2 * 1 = 4!

Другими словами, 5! = 5 * 4! , 4! = 4 * 3! и так далее.

Таким образом, мы можем сказать, что n! = n * (n-1)!. Это будет рекурсивный шаг нашего факториала!

Факториальная рекурсия заканчивается, когда она достигает 1. Это будет наш базовый случай. Мы вернем 1 , если n равно 1 или меньше, покрывая нулевой ввод.

Взглянем на нашу рекурсивную факторную функцию:

Как вы видите, блок if воплощает наш базовый вариант, в то время как блок else охватывает рекурсивный шаг.

В этот раз введём 3:

В итоге тот же результат. Но на этот код более сложный:

Когда мы вводим данные, функция проверит блок if , и, поскольку 3 больше 1, она перейдет к блоку else . В этом блоке мы видим строчку return n * get_factorial_recursively(n-1) .

Мы знаем значение n , оно равно 3 , но get_factorial_recursively(n-1) еще предстоит его вычислить.

Затем программа вызывает ту же функцию еще раз, но на этот раз наша функция принимает 2 в качестве параметра. Он проверяет блок if , переходит к блоку else и снова встречается с последней строкой. Теперь текущее значение n равно 2 , но программа все равно должна вычислить get_factorial_recursively(n-1) .

Поэтому он снова вызывает функцию, но на этот раз блок if , или, скорее, базовый класс, успешно возвращает 1 и выходит из рекурсии.

Следуя тому же шаблону, он возвращает каждый результат функции, умножая текущий результат на предыдущий n и возвращая его для предыдущего вызова функции. Другими словами, наша программа сначала доходит до нижней части факториала (который равен 1), затем идёт вверх, умножая на каждом шаге.

Также удаляет функцию из стека вызовов одну за другой, пока не будет возвращен конечный результат n * (n-1) .

Обычно именно так работают рекурсивные функции. Некоторые более сложные задачи могут потребовать более глубоких рекурсий с более чем одним базовым случаем или более чем одним рекурсивным шагом. Но на данный момент этой простой рекурсии достаточно, чтобы решить наш факториал!

Заключение

В этой статье мы рассмотрели, как вычислять факториалы с использованием циклов for и while . Мы также узнали, что такое рекурсия и как вычислять факториал с помощью рекурсии.

Если вам понравилась рекурсия и вы хотите больше практиковаться, попробуйте вычислить последовательность Фибоначчи с помощью рекурсии! И если у вас есть какие-либо вопросы или мысли по поводу нашей статьи, не стесняйтесь делиться ими в разделе комментариев.

Эта статья посвящена математическим функциям в Python. Для выполнения математических операций необходим модуль math .

Что такое модуль?

В C и C++ есть заголовочные файлы, в которых хранятся функции, переменные классов и так далее. При включении заголовочных файлов в код появляется возможность не писать лишние строки и не использовать одинаковые функции по несколько раз. Аналогично в Python для этого есть модули, которые включают функции, классы, переменные и скомпилированный код. Модуль содержит группу связанных функций, классов и переменных.

  1. Модули, написанные на Python ( .py ).
  2. Модули, написанные на C и загружаемые динамически ( .dll , .pyd , .so , .sl и так далее).
  3. Модули, написанные на C , но связанные с интерпретатором.

Для получения списка модулей, написанных на C , но связанных с Python, можно использовать следующий код.

Как видно из списка выше, модуль math написан на C , но связан с интерпретатором. Он содержит математические функции и переменные, о которых дальше и пойдет речь.

Функции представления чисел

ceil() и floor() — целая часть числа

Сeil() и floor() — функции общего назначения. Функция ceil округляет число до ближайшего целого в большую сторону. Функция floor убирает цифры десятичных знаков. Обе принимают десятичное число в качестве аргумента и возвращают целое число.

Пример:

Функция fabs() — абсолютное значение

Функция fabs используется для вычисления абсолютного значения числа. Если число содержит любой отрицательный знак ( - ), то функция убирает его и возвращает положительное дробное число.

Пример:

factorial() — функция факториала

Эта функция принимает положительное целое число и выводит его факториал.

Пример:

Примечание: при попытке использовать отрицательное число, возвращается ошибка значения ( Value Error ).

Пример:

Функция fmod() — остаток от деления

Функция fmod(x,y) возвращает x % y . Разница в том, что выражение x % y работает только с целыми числами, а эту функцию можно использовать и для чисел с плавающей точкой.

Пример:

Функция frexp()

Эта функция возвращает мантиссу и показатель степени в виде пары ( m,n ) любого числа x , решая следующее уравнение.

Функция frexp()

Пример:

Функция fsum() — точная сумма float

Вычисляет точную сумму значений с плавающей точкой в итерируемом объекте и сумму списка или диапазона данных.

Пример:

Функции возведения в степень и логарифма

Функция exp()

Эта функция принимает один параметр в виде дробного числа и возвращает e^x .

Пример:

Функция expm1()

Эта функция работает так же, как и exp , но возвращает exp(x)-1 . Здесь, expm1 значит exm-m-1 , то есть, exp-minus-1 .

Пример:

Функция log() — логарифм числа

Функция log(x[,base]) находит логарифм числа x по основанию e (по умолчанию). base — параметр опциональный. Если нужно вычислить логарифм с определенным основанием, его нужно указать.

Пример:

Функция log1p()

Эта функция похожа на функцию логарифма, но добавляет 1 к x . log1p значит log-1-p , то есть, log-1-plus .

Пример:

Функция log10()

Вычисляет логарифм по основанию 10.

Пример:

Функция pow() — степень числа

Используется для нахождение степени числа. Синтаксис функции pow(Base, Power) . Она принимает два аргумента: основание и степень.

Пример:

Функция sqrt() — квадратный корень числа

Эта функция используется для нахождения квадратного корня числа. Она принимает число в качестве аргумента и находит его квадратный корень.

Пример:

Тригонометрические функции

В Python есть следующие тригонометрические функции.

ФункцияЗначение
sin принимает радиан и возвращает его синус
cos принимает радиан и возвращает его косинус
tan принимает радиан и возвращает его тангенс
asin принимает один параметр и возвращает арксинус (обратный синус)
acos принимает один параметр и возвращает арккосинус (обратный косинус)
atan принимает один параметр и возвращает арктангенс (обратный тангенс)
sinh принимает один параметр и возвращает гиперболический синус
cosh принимает один параметр и возвращает гиперболический косинус
tanh принимает один параметр и возвращает гиперболический тангенс
asinh принимает один параметр и возвращает обратный гиперболический синус
acosh принимает один параметр и возвращает обратный гиперболический косинус
atanh принимает один параметр и возвращает обратный гиперболический тангенс

Пример:

Функция преобразования углов

Эти функции преобразуют угол. В математике углы можно записывать двумя способами: угол и радиан. Есть две функции в Python, которые конвертируют градусы в радиан и обратно.

Факториалом числа называют произведение всех натуральных чисел до него включительно. Например, факториал числа 5 равен произведению 1 * 2 * 3 * 4 * 5 = 120.

Формула нахождения факториала:

n! = 1 * 2 * … * n,

где n – это число, а n! – факториал этого числа.

Формулу можно представить в таком виде:

n! = 1 * … * (n-2) * (n-1) * n,

т. е. каждое предыдущее число меньше на единицу, чем последующее.

С помощью цикла можно найти факториал как по первой, так и второй формуле. Для вычисления факториала с помощью рекурсии используется вторая формула.

Вычисление факториала циклом

Вычисление факториала с помощью цикла for:

Нахождение факториала рекурсией

0 шаг. Вызов функции: fac(5)
1. fac(5) возвращает fac(4) * 5
2. fac(4) => fac(3) * 4
3. fac(3) => fac(2) * 3
4. fac(2) => fac(1) * 2
5. fac(1) => 1
6. 1 * 2 – возврат в вызов fac(2)
7. 2 * 3 – fac(3)
8. 6 * 4 – fac(4)
9. 24 * 5 – fac(5)
10. Возврат в основную ветку программы значения 120.

Функция factorial() модуля math

Модуль math языка программирования Python содержит функцию factorial(), принимающую в качестве аргумента неотрицательное целое число и возвращающую факториал этого числа:

Я новичок в Python и в настоящее время читаю на Python 3 для абсолютного новичка и сталкиваются с проблемой.

Я хотел бы рассчитать факториал с помощью процедуры.

  1. запрос пользователя на ввод неотрицательного числа n
  2. затем используйте for loop для вычисления факториала

в то время как я хотел бы добавить функцию, чтобы проверить, является ли входной номер N неотрицательное число. например:

Я хочу, чтобы пользователь снова ввел N, если это не неотрицательное число.

Спасибо за вашу нежную помощь.

конструкция может выглядеть так:

В Python 3, input() возвращает строку. Вы должны преобразовать его в число во всех случаях. Ваш N != int(N) таким образом, нет смысла, так как вы не можете сравнить строку с int.

вместо попробовать чтобы преобразовать его в int напрямую,и если это не сработает, пусть пользователь снова войдет. Это отклоняет числа с плавающей запятой, а также все остальное, что недопустимо как целое число.

в математической библиотеке Python есть факториальная функция. Вы можете использовать его так:

поскольку вы хотите вычислить с помощью цикла, однако, вы рассмотрели следующее?

обратите внимание, что второе решение не работает для N = 0, где ans = 1 является правильным по определению факториала.

вы можете проверить математический модуль для python.

вернуться х факторный. Повышает ValueError, если x не является интегралом или отрицательным.

95 Nir Levy [2011-02-28 01:22:00]

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

142 schnaader [2011-02-28 01:24:00]

Самый простой способ: math.factorial(x) (доступно в 2.6 и выше).

Если вы хотите/должны сами написать его, используйте что-то вроде

или что-то более читаемое:

Как всегда, Google – ваш друг;)

85 Joril [2011-02-28 01:25:00]

В Python 2.6 и выше попробуйте:

22 ciziar [2012-11-02 02:23:00]

Не обязательно, так как это такой старый поток. Но я сделал здесь еще один способ вычислить факториал целого числа, используя цикл while.

15 Tadeck [2012-01-29 03:12:00]

Существующее решение

Самое короткое и, вероятно, самое быстрое решение:

Построение собственных

Вы также можете создать собственное решение. Как правило, у вас есть два подхода. Тот, который мне подходит лучше всего:

(он работает также для больших чисел, когда результат становится long )

Второй способ достижения этого:

7 Nishanth [2013-10-19 14:51:00]

Если вы используете Python2.5 или старше, попробуйте

для нового Python, в математическом модуле есть факториал, как указано в других ответах здесь.

4 rahulm [2013-07-25 04:15:00]

Еще один метод вычисления факториала с использованием цикла for-loop –

2 Jordan [2011-02-28 01:27:00]

Вы имеете в виду:

Из соображений производительности, пожалуйста, не используйте рекурсию. Это было бы катастрофично.

Проверьте результаты бега

Использование стека удобно (например, рекурсивный вызов), но оно обходится дорого: хранение подробной информации может занимать много памяти.

Если стек высок, это означает, что компьютер хранит много информации о вызовах функций.

Метод занимает только постоянную память (как итерация).

Или Использование для цикла

Проверьте результаты бега

Или используя встроенную функцию математики

Проверьте результаты бега

Вот моя попытка

Я знаю, что на этот вопрос ответили, но вот еще один метод с пониманием обратного списка диапазонов, делающий диапазон более легким для чтения и более компактным:

Также работает одна строка, быстрые и большие числа:

Многие из этих методов очень хороши, но я бы сказал, что ваш лучший выбор – всегда использовать встроенную функцию. Однако есть очень легко создаваемые, если вы хотите увидеть, что происходит. Быстрый, который я придумал, почти так же, как и многие из них здесь.

Это довольно эффективный код, преимущество в том, что список создается, если вы не будете манипулировать некоторыми данными из списка, хотя я не уверен, почему вы действительно это делаете.

Изменить: только что увидел, что я разместил это на старой вещи. К сожалению.

Читайте также: