Рубрики
Без рубрики

Python одна линия рекурсии

Два способа написания рекурсивного одноклассника: (1) Запишите функцию с оператором возврата в одну строку, такую как def f (x): return f (x + 1), или (2) назначить функцию лямбда на Имя переменной и используйте имя переменной в обратной экспрессии функции лямбда, таких как x: … Python одна линия рекурсии Подробнее »

Автор оригинала: Chris.

Два способа написания рекурсивного одноклассника: (1) Написать функцию с оператором возврата в одной строке, такую как def f (x): return f (x + 1) , или (2) назначить функцию лямбда на имя переменной и использовать имя переменной в обратной экспрессии функции лямбда, таких как f x: f (x) Отказ Чтобы определить корпус рекурсионного база, вы можете использовать The Terary Operator х если с остальными y вернуть х Если условие C встречается, еще y Отказ

Давайте погрузимся в проблему и несколько подробных примеров!

Проблема : Как написать рекурсивную функцию в одной строке кода?

Вы можете обнаружить это сложное, потому что вам нужно определить имя функции, базовый чехол и рекурсивную функцию Call-все в одной строке кода Python!

Связанная статья : Обновить свои общие навыки рекурсии, Проверьте мой подробный список блога (включая видео).

Вот обзор различных алгоритмов, мы однотиплинированные рекурсивно! 😉.

Упражнение : Запустите код и проверьте результаты. Они правильные? Теперь измените входы в базовые случаи рекурсии и снова запустите код! Они правильные?

Давайте погрузимся в каждый из этих методов!

Метод 1: рекурсивные фибоначчи

Какие номера фибоначчи? Числа фибоначчи – это количество серии Fibonacci. Серия начинается с чисел 0 и 1. Каждый следующий элемент серии – это сумма двух элементов предыдущих серий. Это уже алгоритм для расчета серии Fibonacci!

Рассмотрим следующую проблему: Учитывая номер N> 2 Отказ Рассчитайте список первых n фибоначчи в одной строке кода (начиная с первого числа Fibonacci 0)!

# Method 1: Recursive Fibonacci
def fib(n): return 1 if n in {0, 1} else fib(n-1) + fib(n-2)
print(fib(10))
# 89

Этот одноклассник основан на это Репозиторий GitHub, но сделал более лаконичным и более читаемым. Он использует Тернарный оператор сжать возвращаемое значение функции.

Объяснение Тернар : самый простой тройной оператор х если с остальными y состоит из трех операндов х , C и y Отказ Это выражение с возвращаемой стоимостью. Темнарный оператор возвращает х Если логическое выражение C оценивает Правда Отказ В противном случае, если выражение C оценивает Ложь Торговый оператор возвращает альтернативу y Отказ

Способ 2: рекурсивный фактор

Рассмотрим следующую проблему: Есть 20 футбольных команд в Премьер-лиге Англии. Каждая команда может достичь любого из 20 рангов в конце сезона. Сколько возможных рейтингов существует в премьер-лиге, учитывая 20 фиксированных команд?

Рисунок: Пример трех возможных рейтингов футбольных команд в Премьер-лиге Англии.

На рисунке показаны три разных рейтинга команд. В компьютерной научном терминологии вы обозначаете каждый рейтинг как «перестановка». Перестановка определяется как определенный порядок установленных элементов (здесь: футбольные команды). Используя эту терминологию, наша цель – найти количество перестановок данного набора (множество всех футбольных команд). Количество этих перестановок имеет важные последствия на практике, такие как приложения ставок, прогноз сопоставления и анализ игр. Например, при принятии 100 разных рейтингов с равной вероятностью вероятность определенного ранжирования составляет%. Это может быть использовано в качестве базовой вероятности (априорной вероятности) для алгоритмов прогнозирования игр. В этих предположениях случайно угадаемое рейтинг имеет на 1% вероятность быть правильным результатом после одного сезона.

Как рассчитать количество перестановок данного набора? Как оказывается, факториальная функция Ней! рассчитывает количество перестановок данного набора N элементы. Факториал определяется следующим образом:

Например:

Почему факториал подсчитывает количество перестановок данного набора элементов? Ответ очень прост: скажем, у вас есть набор из десяти элементов S = {S0, S1, ..., S9} и десять ведер B = {b0, b1, ..., b9} Отказ В футбольном примере есть двадцать команд (элементы) и двадцать табличных ранги (ведра). Получить перестановку S , вы могли бы разместить каждый элемент в одно ведро, используя следующий алгоритм:

  • Во-первых, вы принимаете случайный элемент из набора S Отказ В скольких ведрах вы можете разместить этот элемент? Есть десять пустых ведер, поэтому у вас есть десять вариантов.
  • Во-вторых, вы берете следующий элемент из набора. В скольких ведрах вы можете разместить этот элемент? Есть девять пустых ведер, поэтому у вас есть девять опций.
  • Наконец, вы берете последний элемент из набора. В скольких ведрах вы можете разместить этот элемент? Есть только одно пустое ведро, поэтому у вас есть один вариант.

Всего у вас 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 *! разные варианты. Каждый вариант размещения элементов в ведра представляет одну перестановку установленных элементов. Количество перестановок набора с N Элементы это Ней! Отказ

Теперь вы знаете все, что вам нужно знать, чтобы решить следующую проблему: напишите решение Python One-Liner, которое вычисляет количество перестановок Ней! набора с N элементы.

# Method 2: Recursive Factorial
def fac(x): return 1 if x<=1 else x * fac(x-1)
print(fac(10))
# 3628800

Этот одноклассник основан на это Форум пост Но, опять же, я улучшил читаемость и краткости. Например, в целом хорошая идея сначала обрабатывать рекурсионный базовый случай.

Фэктовая функция может быть определена рекурсивно, как

с рекурсионными базовыми случаями, определенными как

Интуиция этих базовых случаев является следующее: набор с одним элементом имеет одну перестановку. И набор с нулевыми элементами имеет одну перестановку (есть один способ назначать нулевые элементы в нулевые ведра).

Способ 3: факториальный одноклассник с лямбдой

Альтернативой для расчета рекурсивного факториала в одной строке следующий:

# Method 3: Recursive Factorial with Lambda
fac = lambda n: 1 if n<=1 else n * fac(n-1)
print(fac(10))
# 3628800

Код использует ранее обсужденный рекурсивный определение. Это создает лямбда Функция С одним аргументом N Отказ Это присваивает функцию лямбда на имя Fac Отказ Наконец, он называет именованную функцию FAC (N-1) Для расчета результата вызова функции FAC (N) Отказ Используя решение для более легкой проблемы FAC (N-1) мы можем построить решение более сложной проблемы FAC (N) Умножая его с аргументом ввода N Отказ Как только мы достигаем рекурсионного база Case N мы просто возвращаем жесткое решение FAC (1) (0) Отказ

Давайте погрузимся в более продвинутый рекурсивный одноклассник: алгоритм Quicksort!

Способ 4: рекурсивный QuickSort One-LiLER

Далее вы узнаете о популярном сортировке алгоритма Quicksort Отказ Удивительно, что одна строка кода Python – это все, что вам нужно для написания алгоритма Quicksort! Этот код основан на Это подробное руководство в блоге Отказ Если вы хотите больше объяснений, проверьте это!

QuickSort сортирует список, рекурсивно разделяя большую проблему (сортируя список) в меньшие проблемы (сортировка двух меньших списков) и объединение решений от меньших проблем таким образом, чтобы она решала большую проблему. Чтобы решить каждую меньшую проблему, та же самая стратегия используется рекурсивно: меньшие проблемы делятся на даже меньшие подпруты, решающие отдельно и объединенные. В связи с этой стратегией Quicksort принадлежит к классу алгоритмов «разделить и завоевать». Давайте погрузиться глубже в алгоритм Quicksort:

Основная идея QuickSort состоит в том, чтобы выбрать элемент поворота, а затем размещать все элементы, которые больше или равны, чем элемент поворота вправо и все элементы, которые меньше, чем элемент поворота влево. Теперь вы разделили большую проблему сортировки списка на две меньшие подпруты: сортировка права и левой раздел списка. То, что вы делаете сейчас, это рекурсивно повторить эту процедуру, пока вы не получите список нулевых элементов. Этот список уже отсортирован, поэтому рекурсион завершается.

На следующем рисунке показан алгоритм Quicksort в действии:

Рисунок: Алгоритм Quicksort выбирает элемент поворота, разбивает список в (i) несортированным подсредством со всеми элементами, которые меньше или равны, чем Pivot, и (ii) unsorted sublist со всеми элементами, которые больше, чем у поворота. Далее алгоритм Quicksort рекурсивно называется двумя несортированными сублистами, чтобы сортировать их. Как только сублисты содержат максимально один элемент, они отсортированы по определению – заканчивается рекурсион. На каждом уровне рекурсии три сублисты (слева, поворот, справа) объединяются до того, как результирующий список передан на более высокий уровень рекурсиона.

Это приводит нас к следующей проблеме:

Создать функцию Q который реализует алгоритм Quicksort в одной строке кода Python – и, таким образом, сортирует любой аргумент, приведенный в виде списка целых чисел.

## The Data
unsorted = [33, 2, 3, 45, 6, 54, 33]


## The One-Liner
q = lambda l: q([x for x in l[1:] if x <= l[0]]) + [l[0]] + q([x for x in l if x > l[0]]) if l else []

 
## The Result
print(q(unsorted))

Листинг: одноклассное решение для алгоритма Quicksort с использованием рекурсии.

Мы уже обсудили рекурсивный алгоритм Quicksort выше. Одноклассник напоминает именно обсужденный алгоритм. Во-первых, мы создаем новую функцию лямбда Q который принимает только один список списков л Отказ Функция лямбда имеет следующую структуру:

lambda l: q(left) + pivot + q(right) if l else []

Функция лямбда возвращает пустой список [] В случае рекурсионного база (то есть – список сортировки пусто и, следовательно, тривиально сортируется). В любом другом случае он выбирает элемент Pivot в качестве первого элемента списка л , делит все элементы на два сублиста (слева и справа) на основании того, меньше ли они меньше или больше, чем у поворота. Для этого мы используем простой Понимание списка Отказ Поскольку два сублиста не обязательно сортируются, мы рекурсивно выполняем алгоритм Quicksort на них. Наконец, мы объединяем все три списка и вернемся отсортированного списка.

Поэтому результатом является:

## The Result
print(q(unsorted))
# [2, 3, 6, 33, 33, 45, 54]

Python One-Liners Книга

Python Programmemers улучшит свои навыки информатики с этими полезными одноклассниками.

Python One-listers научит вас читать и писать «одноклассники»: краткие заявления полезных функций, упакованных в одну строку кода. Вы узнаете, как систематически распаковать и понимать любую строку кода Python и писать красноречие, мощно сжатый Python, как эксперт.

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

Используйте структуры данных для решения реальных проблем, такие как использование булевой индексации для поиска городов с загрязнением выше среднего Используйте Numpy Basics, такие как массив, форма, ось, тип, вещание, расширенная индексация, нарезка, сортировка, поиск, агрегация и статистика Рассчитайте базовую статистику многомерных массивов данных и алгоритмы K-означает для безоговорочного обучения Создайте более усовершенствованные регулярные выражения с помощью группировки и названных групп, отрицательные LookAeads, сбежавшие символы, пробелы, наборы символов (и наборы отрицательных символов) и жадные/негридические операторы Понимать широкий ассортимент темы компьютерных наук, включая анаграммы, палиндромы, сверты, перестановки, факториалы, простые числа, цифры фибоначчи, обфускации, поиск и алгоритмическую сортировку

К концу книги вы узнаете, как писать Python в его самых утонченных, и создавать краткие, красивые куски «Python Art» в простой строке.

Получите свой Python One-Liners сейчас !!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.