Рекурсия в программировании[править]
В информатике рекурсивными могут быть как вычисления (функции), так и данные (типы). Мощь рекурсивных определений — в способности задать повтор (итерацию) без низкоуровнего контроля за порядком выполнения.
Функцииправить
В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная рекурсия), например, функция А вызывает функцию B, а функция B — функцию A. Количество вложенных вызовов функции или процедуры называется глубиной рекурсии. Следует избегать ненужной глубины, так как это может вызвать переполнение стека вызовов.
Для работы в отлаженной программе рекурсивная функция должна возвращать значение за конечное время. Это осуществляется через задание «базового» случая, когда для определенного значения аргумента выполняется базовое условие: конечная подпрограмма, свободная от самовызова. Рекурсивные же вызовы должны при этом сходиться за конечное время к базовым случаям. Для информатики особый интерес представляют те рекурсивные функции, полнота которых для всех возможных вводных значений (домена функции) — подвергается математическому доказательству.
Хвостовая рекурсияправить
Хвостовая рекурсия — это самовызов функции в последнюю очередь, без дальнейших вычислений, кроме возврата — в предыдущий уровень подвызова функции, либо в среду.
Интерпретаторы и компиляторы функциональных языков программирования, поддерживающие оптимизацию кода (исходного и/или исполняемого), выполняют хвостовую рекурсию в ограниченном объёме памяти при помощи итераций: «зацикленность» программной структуры выслеживается на стадии компиляции, и при работе программы не потребуются ресурсы для выделения памяти отдельно для каждого уровня рекурсивной вложенности.
Данныеправить
Описание типа данных может содержать самоотсылку. Подобные структуры используются при описании списков и графов. Пример описания списка (C++):
class element_of_list; /* необходимо по правилам C++ */ class element_of_list { element_of_list *next; /* ссылка на следующий элемент того же типа */ int data; /* некие данные */ };
Рекурсивная структура данных зачастую обуславливает применение рекурсии для обработки этих данных.
Как сделать Эффект Дросте или бесконечная фотография
Многие же из Вас видели подобные фотографии,и я не исключение,и мне также интересно было знать,как сделать подобный эффект.
Информации на эту тему в принципе много,но вот способ реализации мне не понравился,дело в том,что все уроки написаны для связки GIMP+плагин MathMap,меня такой вариант не устраивает,так как не признаю ГИМП,да и не хотелось мне его скачивать ради того,чтобы сделать,ну максимум пару-тройку картинок.И решение конечно же было мной найдено,причём случайно.Ещё с прошлого года у меня есть программа MediaChance Photo-Brush,на неё у меня есть кое-какие планы (в плане уроков и обучения),программа очень качественная,впрочем как и все продукты MediaChance,в дальнейшем я планирую выложить уроки по этой проге.И вот,оказалось,что эта прога умеет делать этот эффект,чему я даже обрадовался.Теперь и Вам покажу,как это делается.Всего нам потребуется буквально пару кликов мышкой.
Собственно нам потребуется сама прога MediaChance Photo-Brush (Скачать) и подходящая фотография.Я буду использовать такую:
Скажу честно,пока у меня нет особо времени для экспериментов с этой прогой,поэтому я использую фотографию,которая уж точно подойдёт для Эффекта Дросте,Вы же можете поэкспериментировать с разными,думаю всё должно получиться.
Открываем фото в проге Ctrl+O,выбираем Selection Tools,затем инструмент Polygon,теперь выделяем центр картинки (если вы делаете по подобной фотке),выделение делается кликами ЛКМ (левой кнопкой мыши),и так,кликаем по углам,а потом жмём ПКМ,появятся выделение («бегающие муравьи»).
Теперь меню Adjust-Fractal Droste,появится окно эффекта,всё что дальше делать,является лишь методом проб и ошибок,какой-то конкретной настройки нет,поэтому крутите-вертите ползунки для достижения результата,который удовлетворит.
Потом жмём Ок и картинка генерируется.Вот и весь процесс.Так что экспериментируйте с настройками !А что касается «не очевидных» фотографий,тут главное разобраться,как правильно сделать выделение Полигональным Лассо.
Или вот так:
Вариантов много.Так что дерзайте…
В искусстве
Рекурсивные куклы: оригинальный набор матрешки по Zvyozdochkin и Малютин , 1892 г.
Передняя поверхность Giotto «s Stefaneschi Триптих , 1320, рекурсивно содержит образ себя (держится на коленах фигуры в центральной панели).
Русская кукла или матрешка — физический художественный пример рекурсивной концепции.
Рекурсия использовалась в картинах со времен Триптиха Стефанески» Джотто , созданного в 1320 году. На его центральной панели изображена преклоненная фигура кардинала Стефанески, держащего сам триптих в качестве подношения. неудачная проверка
Эшер «S печати Галерея (1956) является печать на которой изображен искаженный город , содержащий галерею , которая рекурсивно содержит изображение, и так до бесконечности .
Ссылки
-
«1863–1918 от кондитера до производителя шоколада» . Дросте . Архивировано из оригинала 4 марта 2016 года . Проверено 28 февраля 2018 .
Примерно в 1900 году изображение «медсестры» появилось на банках с какао Дросте. Скорее всего, он изобретен коммерческим художником Яном (Йоханнесом) Мюссе, вдохновленным пастелью швейцарского художника Жана Этьена Лиотара «La serveuse de chocolat», также известной как «La belle chocolatière».
- Törnqvist, Эгиль. Ибсен: Кукольный дом , стр 105, Cambridge University Press (1995) ISBN 978-0-521-47866-3
- «Droste, altijd welkom» . cultuurarchief.nl . Архивировано 30 марта 2008 года . Проверено 18 ноября 2007 года .
- ^ Меров, Кэтрин (2013). «Эшер и эффект Дросте» . Математическая ассоциация Америки . Архивировано 2 августа 2013 года.
- Нэнни, Макс; Фишер, Ольга (2001). Мотивированный знак: иконичность в языке и литературе . Джон Бенджаминс . п. 37. ISBN 978-90-272-2574-0.
-
Juola, Патрик; Рамзи, Стивен (2017). Шесть сентября: математика для гуманиста . Zea Books. п. . ISBN 978-1-60962-111-7.
Помещая изображение внутрь изображения, вы получаете последовательность значительно меньших, но самоподобных изображений (на коробке с какао Droste есть изображение женщины, держащей коробку с какао Droste …). Теоретически такое вложение может продолжаться бесконечно в бесконечных деталях, но с практической точки зрения разрешение изображения ограничивает то, как оно на самом деле нарисовано.
- «Джотто ди Бондоне и помощники: триптих Стефанески» . Ватикан . Архивировано 30 ноября 2016 года . Проверено 23 июня +2008 .
- См. Сборник статей Whatling, Stuart (16 февраля 2009 г.). «Средневековая« миз-ан-абим »: объект, изображенный внутри себя» . Институт Курто . Архивировано 2 ноября 2013 года. для примеров и мнений о том, как этот эффект использовался символически.
- де Смит, B .; Ленстра, HW (2003). «Математическая структура галереи печати Эшера» . Уведомления Американского математического общества . 50 (4): 446–451. Архивировано из оригинала 16 апреля 2021 года . Проверено 28 апреля 2021 года .
- Ленстра, Хендрик; Де Смит, Барт. «Применение математики к галерее печати Эшера» . Лейденский университет. Архивировано из оригинального 14 января 2018 года . Проверено 10 ноября 2015 года .
- Барр, Джейсон; Мустачио, Камилла Д.Г. (15 мая 2014 г.). Язык Доктора Кто: от Шекспира до чужих языков . Роуман и Литтлфилд . п. 41. ISBN 978-1-4422-3481-9. Архивировано 10 февраля 2019 года . Проверено 17 октября +2016 .
- Ден Хартог, Бен (11 ноября 2011 г.). «Эффект Дросте на альбоме Pink Floyd Ummagumma» . OtherFocus. Архивировано из оригинального 24 ноября 2015 года . Проверено 21 сентября 2015 года .
- Келли, Стюарт (31 декабря 2013 г.). «Мышь и его дитя Рассела Хобана: трогательная метафизика для детей» . Хранитель . Архивировано 14 ноября 2017 года . Проверено 13 ноября 2017 года .
- «Консервы для собак Bonzo» . Коробка Vox. 20 ноября 2013 года. Архивировано 14 ноября 2017 года . Проверено 13 ноября 2017 года .
- Маршалл, Брайан Роберт (8 мая 2013 г.). «Модельная деревня, Модельная деревня, Модельная деревня, Старая Новая Гостиница, Буртон-он-Зе-Уотер» . География. Архивировано 11 декабря 2020 года . Проверено 17 апреля 2020 .
- Дэвис, Кэролайн (19 апреля 2013 г.). «Модельная деревня Буртон-он-те-Уотер получает статус внесенного в список II степени» . Хранитель . Архивировано 8 декабря 2020 года . Проверено 17 апреля 2020 .
Не приведёт ли рекурсивная функция к бесконечному циклу?
Да, такой исход вполне возможен. Однако, как и у функции или , рекурсию можно прервать условием , чтобы функция перестала вызывать саму себя.
Вот пример кода того, как можно реализовать функцию обратного отсчёта с использованием рекурсии:
Как прервать рекурсию:
Допустим, у нас имеется функция , которая принимает аргумент . Чтобы реализовать обратный отсчёт, нам следует повторить последовательность действий, понижающих значение параметра. Создадим условие вида:
Если больше , то вызвать функцию и вернуться в начало цикла, затем вычесть единицу и снова проверить, выполняется ли условие .
По умолчанию нам нужно создать базовое условие функции, возвращающее значение , чтобы предотвратить попадание в бесконечный цикл. Базовым условием функции здесь будет условие о том, что любое значение больше 1 не вызовет прерывание цикла.
Проще говоря, рекурсия делает то же, что и код ниже:
В культуре
- Большая часть шуток о рекурсии касается бесконечной рекурсии, в которой нет условия выхода, например, известно высказывание: «чтобы понять рекурсию, нужно сначала понять рекурсию»
Весьма популярна шутка о рекурсии, напоминающая словарную статью:
.
- Тема рекурсии присутствует во многих рассказах и очерках аргентинского писателя Хорхе Луиса Борхеса.
- Несколько рассказов Станислава Лема посвящены (возможным) казусам при бесконечной рекурсии:
- рассказ из «Кибериады» о разумной машине, которая обладала достаточным умом и ленью, чтобы для решения поставленной задачи построить себе подобную и поручить решение ей (итогом стала бесконечная рекурсия, когда каждая новая машина строила себе подобную и передавала задание ей);
- рассказ про Ийона Тихого «Путешествие четырнадцатое» из «Звёздных дневников Ийона Тихого», в котором герой последовательно переходит от статьи о сепульках к статье о сепуляции, оттуда к статье о сепулькариях, в которой снова стоит отсылка к статье «сепульки»:
Рекурсивный герб Российской Федерации
- Рекурсивные акронимы: GNU (GNU Not Unix), PHP (PHP: Hypertext Preprocessor), WINE (Wine Is Not an Emulator) и т. д.
- Герб Российской Федерации является рекурсивно-определённым графическим объектом: в правой лапе изображённого на нём двуглавого орла зажат скипетр, который венчается уменьшенной копией герба. Так как на этом гербе в правой лапе орла также находится скипетр, получается бесконечная рекурсия.
Минусы:
Рекурсивные функции занимают значительный объём памяти во время своего выполнения. Это означает, что при каждом вызове функции в стек будет добавляться новый элемент, который будет занимать место до тех пор, пока функция не завершит работу, найдя ответ, либо пока не дойдёт до выполнения базового условия функции.
Рекурсивные функции замедляют программу.
Несмотря на то, что уже было сказано про мемоизацию, наш код можно ускорить, если применить циклы или . Помимо того, что функция может быть попросту плохо написана, мы также рискуем переполнить стек, что в конечном итоге приведёт к снижению скорости и программным ошибкам.
Что такое «стек»?
Стек — это такая структура данных, которая работает по принципу «Last In, First Out» (последним пришёл — первым ушёл). Таким образом, элемент «проталкивается» в стек и добавляется в его конец, а затем «выталкивается» из стека при удалении.
Стеки замечательны тем, что они очень быстрые. Большое «О» этого алгоритма равно O(1). Такая результативность объясняется тем, что при рекурсиях не используются циклы, вместо них используются функции , и .
Визуализация стека
Стоит ли использовать рекурсии вместо обычных циклов?
Оба этих метода одинаково эффективны для решения задач, однако выбор одного из них зависит от типа проблемы, поставленной перед вами.
Рекурсии эффективны тогда, когда вы работаете с данными, которые слишком сложны, чтобы пройтись по ним с помощью обычных циклов. Стоит также не забывать о ценности памяти и уменьшении времени, идущем вкупе с рекурсивной функцией, в которой накопилось слишком много элементов.
Циклы так же эффективны в плане скорости и оптимизации, они занимают меньше памяти в стеке и их легче понять, потому что в теле цикла содержится больше информации о том, что происходит внутри.
- Как освоить алгоритмы?
- Алгоритмы машинного обучения простым языком. Часть 1
- 4 принципа успешной поисковой системы и не только
В информатике
Распространенный метод упрощения — разделение проблемы на подзадачи одного типа. Как метод компьютерного программирования, это называется разделяй и властвуй и является ключом к разработке многих важных алгоритмов. Разделяй и властвуй — это нисходящий подход к решению проблем, когда проблемы решаются путем решения меньших и меньших примеров. Противоположный подход — динамическое программирование. Этот подход служит восходящим подходом, когда проблемы решаются путем решения все более и более крупных экземпляров, пока не будет достигнут желаемый размер.
Классическим примером рекурсии является определение функции factorial, приведенное здесь в коде C :
unsigned int factorial (unsigned int n) {if (n == 0) {возврат 1; } else {вернуть n * факториал (n - 1); }}
Функция рекурсивно вызывает себя для меньшей версии ввода и умножает результат рекурсивного вызова на , пока не достигнет базовый случай, аналогично математическому определению факториала.
Рекурсия в компьютерном программировании иллюстрируется, когда функция определяется в терминах более простых, часто меньших версий самой себя. Затем решение проблемы разрабатывается путем объединения решений, полученных из более простых версий проблемы. Одним из примеров применения рекурсии является парсеры для языков программирования. Большое преимущество рекурсии состоит в том, что бесконечный набор возможных предложений, схем или других данных может быть определен, проанализирован или произведен конечной компьютерной программой.
Отношения рекурсии — это уравнения, которые рекурсивно определяют одну или несколько последовательностей. Некоторые конкретные виды рекуррентных отношений могут быть «решены» для получения нерекурсивного определения (например, выражение в закрытой форме ).
Использование рекурсии в алгоритме имеет как преимущества, так и недостатки. Основное преимущество обычно — простота инструкции. Основным недостатком является то, что использование памяти рекурсивными алгоритмами может очень быстро расти, что делает их непрактичными для больших экземпляров.
По математике
Треугольник Серпинского -a ограничивается рекурсию из треугольников, образующих фрактал
Рекурсивно определенные множества
Пример: натуральные числа
Канонический пример рекурсивно определенного множества — это натуральные числа
- 0 находится в N{\ Displaystyle \ mathbb {N}}
- если n вN{\ Displaystyle \ mathbb {N}}, то n + 1 находится вN{\ Displaystyle \ mathbb {N}}
- Набор натуральных чисел — это наименьший набор, удовлетворяющий двум предыдущим свойствам.
В математической логике аксиомы Пеано (или постулаты Пеано или аксиомы Дедекинда – Пеано) — это аксиомы для натуральных чисел, представленные в XIX веке немецким математиком Ричардом Дедекиндом и итальянским математиком Джузеппе Пеано . Аксиомы Пеано определяют натуральные числа, относящиеся к рекурсивной функции-преемнику, а также сложение и умножение как рекурсивные функции.
Пример: процедура доказательства
Другой интересный пример — это набор всех «доказуемых» предложений в аксиоматической системе , которые определены в терминах процедуры доказательства, которая индуктивно (или рекурсивно) определяется следующим образом:
- Если предложение является аксиомой, это доказуемое предложение.
- Если предложение может быть получено из истинно достижимых предложений с помощью правил вывода, это предложение доказуемо.
- Набор доказываемых предложений — это наименьший набор предложений, удовлетворяющих этим условиям.
Правила конечного деления
Правила конечного подразделения — это геометрическая форма рекурсии, которую можно использовать для создания фрактальных изображений. Правило подразделения начинается с набора полигонов, помеченных конечным числом меток, а затем каждый полигон подразделяется на меньшие помеченные полигоны способом, который зависит только от меток исходного многоугольника. Этот процесс можно повторять. Стандартная техника «средних третей» для создания множества Кантора — это правило подразделения, как и барицентрическое подразделение .
Функциональная рекурсия
Функция может быть рекурсивно определена в терминах самого по себе. Знакомый пример — последовательность чисел ФибоначчиF ( n ) = F ( n — 1) + F ( n — 2). Чтобы такое определение было полезным, оно должно быть сведено к нерекурсивно определенным значениям: в этом случае F (0) = 0 и F (1) = 1.
Известной рекурсивной функцией является функция Аккермана , которая, в отличие от последовательности Фибоначчи, не может быть выражена без рекурсии. необходима цитата
Доказательства с использованием рекурсивных определений
Применение стандартной техники доказательства по случаям к рекурсивно определенным множествам или функциям, как в предыдущих разделах, дает структурную индукцию — мощное обобщение математической индукции, широко используемое для получения доказательств в математической логике и информатике.
Рекурсивная оптимизация
Динамическое программирование — это подход к оптимизации, который переформулирует задачу многопериодной или многоступенчатой оптимизации в рекурсивной форме. Ключевым результатом динамического программирования является уравнение Беллмана , которое записывает значение задачи оптимизации на более раннем этапе (или на более раннем этапе) в терминах его значения на более позднем этапе (или на более позднем этапе).
Теорема о рекурсии
В теории множеств это теорема, гарантирующая существование рекурсивно определенных функций. Для множества X , элемента a из X и функции fX → X теорема утверждает, что существует единственная функцияFN→Икс{\ Displaystyle F: \ mathbb {N} \ to X} (куда N{\ Displaystyle \ mathbb {N}} обозначает множество натуральных чисел, включая ноль) таких, что
- F()знак равноа{\ Displaystyle F (0) = а}
- F(п+1)знак равнож(F(п)){\ Displaystyle F (n + 1) = f (F (n))}
для любого натурального числа n .
Доказательство уникальности
Возьмите две функции FN→Икс{\ Displaystyle F: \ mathbb {N} \ to X} а также граммN→Икс{\ Displaystyle G: \ mathbb {N} \ to X} такой, что:
- F()знак равноа{\ Displaystyle F (0) = а}
- грамм()знак равноа{\ Displaystyle G (0) = а}
- F(п+1)знак равнож(F(п)){\ Displaystyle F (n + 1) = f (F (n))}
- грамм(п+1)знак равнож(грамм(п)){\ Displaystyle G (п + 1) = е (G (п))}
где является элементом X .
Математической индукцией можно доказать, что F ( n ) = G ( n ) для всех натуральных чисел
n
- Базовый случайF (0) = a = G (0), поэтому равенство выполняется для n = 0 .
-
Индуктивный шаг : предположим, что F ( k ) = G ( k ) для некоторогоk∈N{\ Displaystyle к \ в \ mathbb {N}}. Тогда F ( k + 1) = f ( F ( k )) = f ( G ( k )) = G ( k + 1) .
- Следовательно, из F ( k ) = G ( k ) следует F ( k + 1) = G ( k + 1) .
По индукции F ( n ) = G ( n ) для всехп∈N{\ Displaystyle п \ в \ mathbb {N}}.
Официальные определения
Уроборос
В математике и информатике класс объектов или методов демонстрирует рекурсивное поведение, когда его можно определить двумя свойствами:
- Простой базовый вариант (или случаи) — сценарий завершения, который не использует рекурсию для получения ответа
- Рекурсивный шаг — набор правил, сокращающих все остальные случаи до ard the base case
Например, ниже приводится рекурсивное определение предка человека. Один из предков — это либо:
- Один родитель (базовый случай), либо
- Один родительский предок (рекурсивный шаг).
Последовательность Фибоначчи — еще один классический пример рекурсии:
Fib (0) = 0 как базовый случай 1, {\ displaystyle {\ text {Fib}} (0) = 0 {\ text {как базовый случай 1,}}}
Fib (1) = 1 как базовый случай 2, {\ displaystyle {\ text {Fib}} (1) = 1 {\ text {как базовый случай 2,}}}
Для всех целых чисел n>1, Fib (n): = Fib (n — 1) + Фиб (n — 2). {\ displaystyle {\ text {Для всех целых чисел}} n>1, ~ {\ text {Fib}} (n): = {\ text {Fib}} (n-1) + {\ text {Fib}} ( n-2).}
Основано на многих математических аксиомах Рекурсивные правила. Например, формальное определение натуральных чисел с помощью аксиом Пеано можно описать следующим образом: «Ноль — натуральное число, и каждое натуральное число имеет преемника, который также является натуральным числом ». С помощью этого базового случая и правила рекурсии можно сгенерировать набор всех натуральных чисел.
Другие рекурсивно определенные математические объекты включают факториалы, функции (например, рекуррентные отношения ), наборы (например, троичный набор Кантора ) и фракталы.
Существуют различные другие языковые жесткие определения рекурсии; см. рекурсивный юмор.
Взрыв стека
Рекурсивные решения стремятся быть краткими и элегантными. Однако они несут в себе опасность — возможность «взорвать» стек во время выполнения. В Python глубина стека по умолчанию — 1000. Если мы попробуем fact_rec как показано в терминале, в ответ получим:
«Кому нужно высчитывать факториал 1000?» — вопрос логичный. Однако, если используются многочисленные рекурсивные вызовы, вы столкнетесь с проблемами гораздо раньше. Например, при подсчете 50 числа Фибоначчи с помощью fib_rec вам придется очень долго ждать выполнения, хотя запрос кажется не самым серьезным. Причина — экспоненциальная сложность простой реализации.
Функция fib_tail не страдает от этих проблем, т.к. не имеет экспоненциально растущего дерева вызовов, но так же может взорвать вам стек, если будет вызвана для большого числа. Это же высказывание правдиво для fact_tail. Сама по себе хвостовая рекурсия не решает проблему переполнения стека. Нужен ещё один ингридиент, с которым мы коротко разберемся.
Что такое рекурсия
В программировании рекурсивная функция — это такая функция, которая вызывает себя из себя же самой, но с другими значениями параметров.
Примечание. Функция может вызывать себя и через промежуточные функции. Например, функция А запускает функцию Б, а та снова вызывает А.
Цепочка вызовов не может быть бесконечной, она должна прерваться и выдать ответ. Поэтому должен возникать крайний случай (или несколько), когда функции уже не нужно вызывать себя с другими параметрами (то есть погружаться ещё глубже), а можно сразу вернуть результат.
Звучит и правда сложно, но не пугайтесь — с примером станет понятнее.
Классический пример рекурсивной функции — вычисление факториала, то есть произведения натуральных чисел от 1 до N.
Здесь N=0 — это крайний случай: функция ничего не вызывает и сразу возвращает единицу (по определению, факториал нуля равен единице).
В более широком смысле рекурсией называют описание или изображение предмета, объекта, явления внутри самого себя. Рекурсивный принцип — это принцип самовоспроизведения и одновременно усложнения системы по одному и тому же алгоритму.
Тут-то и выясняется, что и нас, людей, тоже можно считать рекурсивными: ведь в клетке заложена информация обо всём организме, в ДНК записана информация о том, как синтезировать ДНК.
Более реалистичные примеры
Перед более сложными главами я бы хотел показать чуть более реалистичную ситуацию с элегантным рекурсивным решением, сложно переписываемым на итеративное.
Возьмем сортировку слиянием. Реализация на Python:
В каком-то роде она всегда напоминает мне обратный обход дерева — мы рекурсивно идем влево,затем рекурсивно идем вправо и комбинируем результаты. Такие алгоритмы достаточно непросто преобразовываются в не рекурсивный код. Попробуйте! Возможно вы придете к эмуляции стека или какому-то принципиально новому алгоритму.
Сортировка слиянием — это пример множественной рекурсии, которую мы уже видели в примере с числом Фибоначчи. Другая распространенная проблема — непрямая рекурсия. Её мы видели в примере четный/нечетный.
Чтобы получить более реалистичный пример рассмотрим парсер рекурсивного спуска для этой грамматики
Весь код можно увидеть здесь (<- ссылка на гитхаб автора). parse_expr вызывает parse_term -> parse_term вызывает parse_fector -> parse_factor опять parse_expr. При сложном выражении стек будет содержать множество экземпляров каждой функции.
__________________________________________________________________________________________
На этом на сегодня все, такой вот клиффхэнгер. Что же случится с нашим героем? В следующих частях мы немного познакомимся с продолжениями, трамплином и в заключении будут упомянуты более естественные для Python инструменты решения задач.
Автор оригинала: Eli Bendersky’s.
Больше моих переводов и материалов можно найти .
Неформальное определение
Недавно освеженная закваска , бурлящая при брожении : рецепт требует немного закваски, оставшейся с последнего приготовления по тому же рецепту.
Рекурсия — это процесс, через который проходит процедура, когда один из шагов процедуры включает вызов самой процедуры. Процедура, которая проходит через рекурсию, называется «рекурсивной».
Чтобы понять рекурсию, нужно различать процедуру и выполнение процедуры. Процедура — это набор шагов, основанный на наборе правил, в то время как выполнение процедуры включает фактическое следование правилам и выполнение шагов.
Рекурсия связана со ссылкой в спецификации процедуры на выполнение какой-либо другой процедуры, но не то же самое.
Когда процедура определяется как таковая, это немедленно создает возможность бесконечного цикла; Рекурсия может быть правильно использована в определении только в том случае, если рассматриваемый шаг пропускается в определенных случаях, чтобы процедура могла быть завершена.
Но даже если она определена должным образом, рекурсивная процедура не проста для выполнения людьми, поскольку требует различения нового и частично выполненного вызова процедуры; это требует некоторого администрирования в отношении того, насколько далеко продвинулись различные одновременные экземпляры процедур. По этой причине рекурсивные определения очень редко встречаются в повседневных ситуациях.
Дом, который построил Джек
Чтобы было понятнее, что такое рекурсия, возьмём стихотворение Самуила Маршака «Дом, который построил Джек»:
Вот дом,
Который построил Джек.
А это пшеница,
Которая в тёмном чулане хранится
В доме,
Который построил Джек.
А это весёлая птица-синица,
Которая часто ворует пшеницу,
Которая в тёмном чулане хранится
В доме,
Который построил Джек.
Вот кот,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в тёмном чулане хранится
В доме,
Который построил Джек.
Вот пёс без хвоста,
Который за шиворот треплет кота,
Который пугает и ловит синицу,
Которая часто ворует пшеницу,
Которая в тёмном чулане хранится
В доме,
Который построил Джек. …
Смотрите, что в нём интересного: каждая часть стихотворения состоит из нового начала и точного повторения того, что уже было до этого. Сначала у нас был только дом, который построил Джек — это нулевой уровень рекурсии, или вложенности.
Нулевой уровень:
Вот дом,
Который построил Джек.
Обозначим его за и дальше будем увеличивать это число для каждого уровня. Следите за уровнями.
Первый уровень:
А это пшеница,
Которая в тёмном чулане хранится
Чтобы получить полноценное продолжение, нам нужно взять предыдущий уровень и подставить его сюда:
А это пшеница,
Которая в тёмном чулане хранитсяВ доме,Который построил Джек.
Второй уровень:
А это весёлая птица-синица,
Которая часто ворует пшеницу,
Если мы будем разворачивать стих, то на первом проходе получим такое:
А это весёлая птица-синица,
Которая часто ворует пшеницу,Которая в тёмном чулане хранится
А на втором у нас уже появится полноценный стих:
А это весёлая птица-синица,
Которая часто ворует пшеницу,Которая в тёмном чулане хранитсяВ доме,Который построил Джек.
Общее правило такое: когда есть рекурсия, её последовательно разворачивают на каждом шаге, пока не дойдут до нулевого уровня. Как только дошли — всё готово, рекурсия сделала своё дело. До этого момента она вызывает сама себя с новыми параметрами.
Эффект
Происхождение
Эффект mise en abyme назван в честь изображения на банках и коробках с какао- порошком Droste, на котором медсестра несет сервировочный поднос с чашкой горячего шоколада и коробку с тем же изображением, созданную Яном Миссетом. Это знакомое изображение было введено в 1904 году и сохранялось в течение десятилетий с небольшими вариациями с 1912 года художниками, в том числе Адольфом Муроном . Поэт и обозреватель Нико Шипмейкер ввел более широкое использование этого термина в конце 1970-х годов.
Математика
Внешний вид рекурсивен : меньшая версия содержит еще меньшую версию изображения и так далее. Только теоретически это может продолжаться вечно, как фракталы ; практически, он продолжается только до тех пор, пока позволяет разрешение изображения, что относительно мало, поскольку каждая итерация геометрически уменьшает размер изображения.
Эффект Дросте путем обработки изображений (с использованием GIMP ). Математически это может продолжаться вечно, но на практике рекурсия ограничена количеством пикселей в изображении.
Средневековое искусство
Эффект Дросте был предсказан Джотто в начале XIV века в его Триптихе Стефанески . В центре алтаря изображен кардинал Джакомо Гаэтани Стефанески, предлагающий Святому Петру сам триптих . Есть также несколько примеров из средневековых книг с изображениями, содержащими саму книгу, или оконных панелей в церквях, изображающих миниатюрные копии самих оконных панелей.
MC Эшер
Голландский художник М.С. Эшер использовал эффект Дросте в своей литографической галерее 1956 года , в которой изображена галерея, содержащая отпечаток, изображающий галерею, каждый раз уменьшенный и повернутый, но с пустотой в центре изображения
Работа привлекла внимание математиков, в том числе Хендрика Ленстры. Они разработали метод заполнения центральной пустоты произведения искусства в дополнительном применении эффекта Дросте путем последовательного поворота и сжатия изображения произведения искусства.
В 20-м веке эффект Дросте использовался для продажи различных продуктов. На упаковке масла была изображена коренная американка, держащая пакет масла с ее фотографией. Соль Мортона также использовала этот эффект. Обложка винилового альбома 1969 года Ummagumma от Pink Floyd показывает участников группы, сидящих в разных местах, а на стене изображена та же сцена, но порядок участников группы меняется. На логотипе бренда сырной пасты The Laughing Cow изображена корова с серьгами. При ближайшем рассмотрении можно заметить, что это изображения круглой упаковки сырной пасты, на каждой из которых изображена смеющаяся корова. Эффект Дросте — тема детского романа Рассела Хобана « Мышь и его ребенок» , появляющаяся в виде этикетки на банке «Bonzo Dog Food», которая изображает самого себя.
Модельная деревня
Трехмерный пример эффекта Дросте можно увидеть в Буртоне-он-те-Уотер , Англия. Макет деревни был построен внутри деревни в 1930-х годах в масштабе 1: 9 с использованием традиционных строительных материалов. Он содержит в себе модель самого себя, которая, в свою очередь, включает еще одну меньшую модель, а затем еще меньшую модель внутри нее.