Автор оригинала: Chris.
Эта статья объясняет простой и эффективный способ вычисления факториала в одной строке кода.
Основы
Рассмотрим следующую проблему: Есть 20 футбольных команд в Премьер-лиге Англии. Каждая команда может достичь любого из 20 рангов в конце сезона. Сколько возможных рейтингов существует в премьер-лиге, учитывая 20 фиксированных команд?
Рисунок: Пример трех возможных рейтингов футбольных команд в Премьер-лиге Англии.
На рисунке показаны три разных рейтинга команд. В компьютерной научном терминологии вы обозначаете каждый рейтинг как «перестановка». Перестановка определяется как определенный порядок установленных элементов (здесь: футбольные команды). Используя эту терминологию, наша цель – найти количество перестановок данного набора (множество всех футбольных команд). Количество этих перестановок имеет важные последствия на практике, такие как приложения ставок, прогноз сопоставления и анализ игр. Например, при принятии 100 разных рейтингов с равной вероятностью вероятность определенного ранжирования составляет%. Это может быть использовано в качестве базовой вероятности (априорной вероятности) для алгоритмов прогнозирования игр. В этих предположениях случайно угадаемое рейтинг имеет на 1% вероятность быть правильным результатом после одного сезона.
Как рассчитать количество перестановок данного набора? Как оказывается, факториальная функция n! рассчитывает количество перестановок данного набора N элементов. Факториал определяется следующим образом:
Например:
Почему факториал подсчитывает количество перестановок данного набора элементов? Ответ очень прост: скажем, у вас есть набор из десяти элементов s = {s0, s1, …, s9} и десять ведер b = {b0, b1, …, b9}. В футбольном примере есть двадцать команд (элементы) и двадцать табличных ранги (ведра). Получить перестановку
- Во-первых, вы принимаете случайный элемент из Set S. в количестве ведерки вы можете разместить этот элемент? Есть десять пустых ведер, поэтому у вас есть десять вариантов.
- Во-вторых, вы берете следующий элемент из набора. В скольких ведрах вы можете разместить этот элемент? Есть девять пустых ведер, поэтому у вас есть девять опций.
- …
- Наконец, вы берете последний элемент из набора. В скольких ведрах вы можете разместить этот элемент? Есть только одно пустое ведро Таким образом, у вас есть один вариант.
Всего у вас 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 *! разные варианты. Каждый вариант размещения элементов в ведра представляет одну перестановку установленных элементов. Количество перестановок набора с N элементов N!.
Код
Теперь вы знаете все, что вам нужно знать, чтобы решить следующую проблему: Написать решение Python One-Liner, которое вычисляет количество перестановок N! набора с n элементами.
## The Data n = 5 ## The One-Liner factorial = lambda n: n * factorial(n-1) if n > 1 else 1 ## The Result print(factorial(n))
Листинг: одноклассное решение, определяющее факториальную функцию рекурсивно.
Какой вывод этого кода?
Как это работает
Фэктовая функция может быть определена рекурсивно, как
с рекурсионными базовыми случаями, определенными как
Интуиция этих базовых случаев является следующее: набор с одним элементом имеет одну перестановку. И набор с нулевыми элементами имеет одну перестановку (есть один способ назначать нулевые элементы в нулевые ведра).
Код использует это рекурсивное определение. Это создает функцию лямбда с одним аргументом n. Он присваивает функцию лямбда на имя факториата. Наконец, он называет именованный факториал функции (N-1) для расчета результата факториата функций Call (n). Используя решение для более легкой задачи факториала (N-1), мы можем построить решение более сложной задачи факториала (n), умножив его с помощью аргумента ввода находчивый Как только мы достигаем рекурсионного базового случая N, мы просто возвращаем жесткокодируемое решение (0).
Этот алгоритм показывает, как часто можно найти простой, краткий и эффективный способ решения проблем, тщательно понимая проблему первым. Выбор простейшей идеи решения является одним из самых важных вещей, которые вы можете сделать при создании собственных алгоритмов. Общая проблема новичков – их загроможденный и ненужный сложный код. Рекурсивное определение факториала более читаемое, чем итеративное определение (без рекурсии). Как бонусное упражнение, попробуйте переписать этот одноклассник без использования рекурсивного определения и без внешних библиотек – это не тривиально и, безусловно, не так красно!
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.
Оригинал: “https://blog.finxter.com/a-simple-python-factorial-program-using-recursion/”