Рекурсия возникает, когда определение понятия или процесса зависит от более простой или предыдущей версии самого себя. [1] Рекурсия используется в различных дисциплинах от лингвистики до логики . Наиболее распространенное применение рекурсии — в математике и информатике , где определяемая функция применяется в рамках своего собственного определения. Хотя это, по-видимому, определяет бесконечное число экземпляров (значений функции), это часто делается таким образом, что не может возникнуть бесконечный цикл или бесконечная цепочка ссылок.
Процесс, демонстрирующий рекурсию, является рекурсивным . Видеоотзыв отображает рекурсивные изображения, как и бесконечное зеркало .
В математике и информатике класс объектов или методов демонстрирует рекурсивное поведение, когда его можно определить двумя свойствами:
Например, ниже приведено рекурсивное определение предка человека . Предком человека является:
Последовательность Фибоначчи — еще один классический пример рекурсии:
Многие математические аксиомы основаны на рекурсивных правилах. Например, формальное определение натуральных чисел аксиомами Пеано можно описать так: «Ноль — это натуральное число, и каждое натуральное число имеет последующее, которое также является натуральным числом». [2] С помощью этого базового случая и рекурсивного правила можно сгенерировать множество всех натуральных чисел.
Другие рекурсивно определяемые математические объекты включают факториалы , функции (например, рекуррентные соотношения ), множества (например, троичное множество Кантора ) и фракталы .
Существуют и другие, более ироничные определения рекурсии; см. рекурсивный юмор.
Рекурсия — это процесс, через который проходит процедура, когда один из шагов процедуры включает вызов самой процедуры. Процедура, которая проходит через рекурсию, называется «рекурсивной». [3]
Чтобы понять рекурсию, нужно осознать разницу между процедурой и выполнением процедуры. Процедура — это набор шагов, основанных на наборе правил, в то время как выполнение процедуры подразумевает фактическое следование правилам и выполнение шагов.
Рекурсия связана со ссылкой в спецификации процедуры на выполнение какой-либо другой процедуры, но не тождественна ей.
Когда процедура определяется таким образом, это немедленно создает возможность возникновения бесконечного цикла; рекурсия может быть правильно использована в определении только в том случае, если рассматриваемый шаг пропускается в определенных случаях, чтобы процедура могла завершиться.
Даже если она правильно определена, рекурсивная процедура нелегка для выполнения человеком, поскольку она требует различения нового и старого, частично выполненного вызова процедуры; это требует некоторого администрирования относительно того, насколько далеко продвинулись различные одновременные экземпляры процедур. По этой причине рекурсивные определения очень редки в повседневных ситуациях.
Лингвист Ноам Хомский , как и многие другие, утверждал, что отсутствие верхней границы количества грамматических предложений в языке, а также отсутствие верхней границы длины грамматического предложения (помимо практических ограничений, таких как время, доступное для его произнесения) можно объяснить как следствие рекурсии в естественном языке. [4] [5]
Это можно понять в терминах рекурсивного определения синтаксической категории, такой как предложение. Предложение может иметь структуру, в которой за глаголом следует другое предложение: Дороти думает, что ведьмы опасны , в котором предложение ведьмы опасны встречается в более крупном предложении. Таким образом, предложение можно определить рекурсивно (очень грубо) как нечто со структурой, которая включает именное словосочетание, глагол и, необязательно, другое предложение. Это на самом деле просто частный случай математического определения рекурсии.
Это дает способ понять креативность языка — неограниченное количество грамматически правильных предложений — поскольку это сразу же предсказывает, что предложения могут быть произвольной длины: Дороти думает, что Тото подозревает, что Железный Дровосек сказал, что... . Существует множество структур помимо предложений, которые можно определить рекурсивно, и, следовательно, множество способов, которыми предложение может встраивать примеры одной категории в другую. [6] За прошедшие годы языки в целом оказались поддающимися такому анализу.
Общепринятая идея о том, что рекурсия является неотъемлемым свойством человеческого языка, была оспорена Дэниелом Эвереттом на основе его утверждений о языке пираха . Эндрю Невинс, Дэвид Песецки и Силен Родригес были среди многих, кто выступал против этого. [7] В любом случае можно утверждать, что литературная самореференция отличается по своему характеру от математической или логической рекурсии. [8]
Рекурсия играет важную роль не только в синтаксисе, но и в семантике естественного языка . Например, слово and можно толковать как функцию, которая может применяться к значениям предложений для создания новых предложений, а также к значениям именных групп, значениям глагольных групп и другим. Она также может применяться к непереходным глаголам, переходным глаголам или дипереходным глаголам. Для того чтобы предоставить ей единое обозначение, которое является достаточно гибким и обычно определяется так, чтобы она могла принимать любые из этих различных типов значений в качестве аргументов. Это можно сделать, определив ее для простого случая, в котором она объединяет предложения, а затем рекурсивно определив другие случаи в терминах простого. [9]
Рекурсивная грамматика — это формальная грамматика , которая содержит рекурсивные правила производства . [10]
Рекурсия иногда используется в юмористическом смысле в компьютерных науках, программировании, философии или учебниках математики, как правило, давая циклическое определение или самоссылку , в которой предполагаемый рекурсивный шаг не приближается к базовому случаю, а вместо этого приводит к бесконечному регрессу . Нередко такие книги включают в свой глоссарий шуточную запись примерно следующего содержания:
Вариант можно найти на странице 269 в индексе некоторых изданий книги Брайана Кернигана и Денниса Ритчи «Язык программирования Си» ; запись в индексе рекурсивно ссылается на себя («рекурсия 86, 139, 141, 182, 202, 269»). Ранние версии этой шутки можно найти в Let's talk Lisp Лорана Сиклосси (опубликовано Prentice Hall PTR 1 декабря 1975 года, с датой авторского права 1976 год) и в Software Tools Кернигана и Плэугера (опубликовано Addison-Wesley Professional 11 января 1976 года). Шутка также появляется в The UNIX Programming Environment Кернигана и Пайка. Она не появлялась в первом издании The C Programming Language . Эта шутка является частью фольклора функционального программирования и была широко распространена в сообществе функционального программирования еще до публикации вышеупомянутых книг. [12] [13]
Другая шутка гласит: «Чтобы понять рекурсию, вы должны понять рекурсию». [11] В англоязычной версии поисковой системы Google при поиске по слову «рекурсия» сайт предлагает «Возможно, вы имели в виду: рекурсия ?» [14] Альтернативная форма — следующая, от Эндрю Плоткина : «Если вы уже знаете, что такое рекурсия, просто запомните ответ. В противном случае найдите того, кто стоит ближе к Дугласу Хофштадтеру , чем вы; затем спросите его или ее, что такое рекурсия».
Рекурсивные аббревиатуры — еще один пример рекурсивного юмора. Например, PHP означает «PHP Hypertext Preprocessor», WINE означает «WINE Is Not an Emulator», GNU означает «GNU's not Unix», а SPARQL означает «SPARQL Protocol and RDF Query Language».
Каноническим примером рекурсивно определенного множества являются натуральные числа :
В математической логике аксиомы Пеано (или постулаты Пеано или аксиомы Дедекинда–Пеано) — это аксиомы для натуральных чисел, представленные в 19 веке немецким математиком Рихардом Дедекиндом и итальянским математиком Джузеппе Пеано . Аксиомы Пеано определяют натуральные числа, ссылаясь на рекурсивную функцию следования, а сложение и умножение — как рекурсивные функции.
Другим интересным примером является множество всех «доказуемых» предложений в аксиоматической системе , которые определяются в терминах процедуры доказательства , которая индуктивно (или рекурсивно) определяется следующим образом:
Правила конечного подразделения — это геометрическая форма рекурсии, которая может использоваться для создания фракталоподобных изображений. Правило подразделения начинается с набора полигонов, помеченных конечным числом меток, а затем каждый полигон подразделяется на меньшие помеченные полигоны способом, который зависит только от меток исходного полигона. Этот процесс можно повторять. Стандартная техника «средних третей» для создания множества Кантора — это правило подразделения, как и барицентрическое подразделение .
Функция может быть рекурсивно определена в терминах самой себя. Знакомый пример — последовательность чисел Фибоначчи : F ( n ) = F ( n − 1) + F ( n − 2). Чтобы такое определение было полезным, оно должно сводиться к нерекурсивно определенным значениям: в этом случае F (0) = 0 и F (1) = 1.
Применение стандартной техники доказательства по случаям к рекурсивно определенным множествам или функциям, как в предыдущих разделах, приводит к структурной индукции — мощному обобщению математической индукции, широко используемому для получения доказательств в математической логике и информатике.
Динамическое программирование — это подход к оптимизации , который переформулирует многопериодную или многошаговую задачу оптимизации в рекурсивной форме. Ключевым результатом динамического программирования является уравнение Беллмана , которое записывает значение задачи оптимизации в более раннее время (или на более раннем шаге) через ее значение в более позднее время (или на более позднем шаге).
В теории множеств это теорема, гарантирующая существование рекурсивно определенных функций. Для множества X , элемента a из X и функции f : X → X теорема утверждает, что существует единственная функция (где обозначает множество натуральных чисел, включая ноль) такая, что
для любого натурального числа n .
Дедекинд был первым, кто сформулировал проблему однозначного определения теоретико-множественных функций с помощью рекурсии и дал набросок аргументации в эссе 1888 года «Was sind und was sollen die Zahlen?» [15]
Возьмем две функции и такие, что:
где a — элемент X.
Методом математической индукции можно доказать , что F ( n ) = G ( n ) для всех натуральных чисел n :
По индукции F ( n ) = G ( n ) для всех .
Распространенным методом упрощения является разделение проблемы на подзадачи одного типа. Как метод компьютерного программирования , это называется разделяй и властвуй и является ключом к разработке многих важных алгоритмов. Разделяй и властвуй служит подходом сверху вниз к решению проблем, где проблемы решаются путем решения все более мелких экземпляров. Противоположным подходом является динамическое программирование . Этот подход служит подходом снизу вверх, где проблемы решаются путем решения все более крупных экземпляров, пока не будет достигнут желаемый размер.
Классическим примером рекурсии является определение функции факториала , приведенное здесь в коде Python :
def factorial ( n ): если n > 0 : вернуть n * factorial ( n - 1 ) иначе : вернуть 1
Функция вызывает себя рекурсивно для меньшей версии входных данных (n - 1)
и умножает результат рекурсивного вызова на n
, пока не достигнет базового случая , аналогично математическому определению факториала.
Рекурсия в компьютерном программировании иллюстрируется, когда функция определяется в терминах более простых, часто меньших версий самой себя. Решение проблемы затем разрабатывается путем объединения решений, полученных из более простых версий проблемы. Одним из примеров применения рекурсии являются синтаксические анализаторы для языков программирования. Большим преимуществом рекурсии является то, что бесконечный набор возможных предложений, конструкций или других данных может быть определен, проанализирован или создан конечной компьютерной программой.
Рекуррентные соотношения — это уравнения, которые определяют одну или несколько последовательностей рекурсивно. Некоторые конкретные виды рекуррентных соотношений могут быть «решены» для получения нерекурсивного определения (например, выражение в замкнутой форме ).
Использование рекурсии в алгоритме имеет как преимущества, так и недостатки. Главным преимуществом обычно является простота инструкций. Главным недостатком является то, что использование памяти рекурсивными алгоритмами может расти очень быстро, делая их непрактичными для более крупных экземпляров.
Формы, которые, как кажется, были созданы рекурсивными процессами, иногда появляются у растений и животных, например, в разветвленных структурах, в которых одна большая часть разветвляется на две или более похожих меньших частей. Одним из примеров является брокколи Романеско . [16]
Авторы используют концепцию рекурсивности , чтобы выдвинуть на первый план ситуацию, в которой оказываются именно социологи , производя знания о мире, частью которого они всегда являются. [17] [18] По словам Одри Алехандро, «как социологи, рекурсивность нашего состояния связана с тем фактом, что мы являемся как субъектами (поскольку дискурсы являются средством, посредством которого мы анализируем), так и объектами академических дискурсов, которые мы производим (поскольку мы являемся социальными агентами, принадлежащими миру, который мы анализируем)». [19] Исходя из этого, она определяет в рекурсивности фундаментальную проблему в производстве освободительного знания, которая требует осуществления рефлексивных усилий:
мы социализированы в дискурсах и диспозициях, созданных социально-политическим порядком, который мы стремимся бросить вызов, социально-политическим порядком, который мы, следовательно, можем воспроизводить бессознательно, стремясь сделать наоборот. Рекурсивность нашей ситуации как ученых — и, точнее, тот факт, что диспозиционные инструменты, которые мы используем для производства знаний о мире, сами производятся этим миром — одновременно демонстрирует насущную необходимость внедрения рефлексивности на практике и представляет собой главную проблему в этом деле.
— Одри Алехандро, Алехандро (2021)
Рекурсия иногда упоминается в науке управления как процесс итерации через уровни абстракции в крупных бизнес-структурах. [20] Распространенным примером является рекурсивная природа иерархий управления , начиная от линейного руководства до высшего руководства через среднее звено управления . Она также охватывает более масштабную проблему структуры капитала в корпоративном управлении . [21]
Матрешка — это физический художественный пример рекурсивной концепции. [22]
Рекурсия использовалась в живописи со времен Триптиха Стефанески Джотто , созданного в 1320 году. Его центральная панель содержит коленопреклоненную фигуру кардинала Стефанески, держащего сам триптих в качестве подношения. [23] [24] Эта практика более известна как эффект Дросте , пример техники Mise en abyme .
«Галерея гравюр » М. К. Эшера ( 1956) — это гравюра, изображающая искаженный город, содержащий галерею, которая рекурсивно содержит изображение, и так до бесконечности . [25]
В фильме «Начало» добавление суффикса -ception к существительному стало разговорной формой, чтобы в шутку указать на рекурсию чего-либо. [26]
Еще примеры рекурсии: Русские матрешки. Каждая кукла сделана из цельного дерева или полая и содержит внутри себя другую матрешку.