Рекурсия (прилагательное: рекурсивный) происходит, когда вещь определяется в терминах самого себя или своего типа. Рекурсия используется в самых разных дисциплинах, от лингвистики до логики. Наиболее распространенное применение рекурсии - в математике и информатике, где определяемая функция применяется в рамках своего собственного определения. Хотя это, по-видимому, определяет бесконечное количество экземпляров (значений функций), это часто делается таким образом, что не может возникнуть бесконечный цикл или бесконечная цепочка ссылок.
В математике и информатике класс объектов или методов демонстрирует рекурсивное поведение, когда его можно определить двумя свойствами:
Например, ниже приводится рекурсивное определение предка человека. Один из предков - это либо:
Последовательность Фибоначчи - еще один классический пример рекурсии:
Основано на многих математических аксиомах Рекурсивные правила. Например, формальное определение натуральных чисел с помощью аксиом Пеано можно описать следующим образом: «Ноль - натуральное число, и каждое натуральное число имеет преемника, который также является натуральным числом ». С помощью этого базового случая и правила рекурсии можно сгенерировать набор всех натуральных чисел.
Другие рекурсивно определенные математические объекты включают факториалы, функции (например, рекуррентные отношения ), наборы (например, троичный набор Кантора ) и фракталы.
Существуют различные другие языковые жесткие определения рекурсии; см. рекурсивный юмор.
Рекурсия - это процесс процедура проходит, когда один из этапов процедуры включает вызов самой процедуры. Процедура, которая проходит через рекурсию, называется «рекурсивной».
Чтобы понять рекурсию, нужно распознавать различие между процедурой и выполнением процедуры. Процедура - это набор шагов, основанный на наборе правил, в то время как выполнение процедуры включает фактическое следование правилам и выполнение шагов.
Рекурсия связана со ссылкой в спецификации процедуры на выполнение какой-либо другой процедуры, но не то же самое.
Когда процедура определяется как таковая, это немедленно создает возможность бесконечного цикла; Рекурсия может быть правильно использована в определении только в том случае, если рассматриваемый шаг пропускается в определенных случаях, чтобы процедура могла быть завершена.
Но даже если она определена должным образом, рекурсивная процедура не проста для выполнения людьми, поскольку требует различения нового и частично выполненного вызова процедуры; это требует некоторого администрирования в отношении того, насколько далеко продвинулись различные одновременные экземпляры процедур. По этой причине рекурсивные определения очень редки в повседневных ситуациях.
Лингвист Ноам Хомский, среди многих других, утверждал, что отсутствие верхней границы количества грамматических предложений в языке и отсутствие верхней границы грамматической длины предложения (помимо практических ограничений, таких как время, доступное для произнесения одного), можно объяснить как следствие рекурсии в естественном языке.
Это можно понять в терминах рекурсивного определения синтаксической категории, например предложения. Предложение может иметь структуру, в которой после глагола следует другое предложение: Дороти думает, что ведьмы опасны, в котором фраза «Ведьмы опасны» встречается в более крупном. Таким образом, предложение может быть определено рекурсивно (очень грубо) как нечто со структурой, которая включает словосочетание, глагол и, возможно, другое предложение. На самом деле это всего лишь частный случай математического определения рекурсии.
Это дает возможность понять творческий потенциал языка - неограниченное количество грамматических предложений - потому что он сразу предсказывает, что предложения могут быть произвольной длины: Дороти думает, что Тото подозревает, что это сказал Железный Человек... Помимо предложений, существует множество структур, которые можно определить рекурсивно, и, следовательно, множество способов, которыми предложение может встраивать экземпляры одной категории в другую. За прошедшие годы языки в целом оказались поддающимися такому анализу.
Однако недавно общепринятая идея о том, что рекурсия является важным свойством человеческого языка, была оспорена Дэниелом Эвереттом на основании его утверждений о языке пираха. Эндрю Невинс, Дэвид Песецки и Силен Родригес - одни из многих, кто выступал против этого. В любом случае можно утверждать, что литературная ссылка на себя отличается от математической или логической рекурсии.
Рекурсия играет важную роль не только в синтаксисе, но и в естественном семантика языка. Слово и, например, может быть истолковано как функция, которая может применяться к значениям предложений для создания новых предложений, а также к значениям именных фраз, значений глагольных фраз и т. Д. Это также может относиться к непереходным глаголам, переходным глаголам или дитранзитивным глаголам. Чтобы предоставить для него единое обозначение, которое является достаточно гибким и обычно определяется так, чтобы оно могло принимать любой из этих различных типов значений в качестве аргументов. Это можно сделать, определив его для простого случая, в котором он объединяет предложения, а затем определив другие случаи рекурсивно в терминах простого.
A рекурсивная грамматика - это формальная грамматика, которая содержит рекурсивное производство rules.
Рекурсия иногда юмористически используется в учебниках по информатике, программированию, философии или математике, обычно давая циклическое определение или самореференцию, в котором предполагаемый рекурсивный шаг не приближается к базовому случаю, а вместо этого приводит к бесконечному регрессу. В таких книгах нет ничего необычного в том, чтобы включить в свой глоссарий анекдот, например:
Вариант можно найти на странице 269 в указателе некоторых изданий. из книги Брайана Кернигана и Денниса Ричи Язык программирования C ; запись индекса рекурсивно ссылается на себя («рекурсия 86, 139, 141, 182, 202, 269»). Ранние версии этой шутки можно найти в «Let's talk Lisp» Лорана Сиклоши (опубликовано Prentice Hall PTR 1 декабря 1975 г. с датой авторских прав 1976 г.) и в «Software Tools» Кернигана и Плагера (опубликовано Addison- Wesley Professional 11 января 1976 г.). Шутка также появляется в «Среде программирования UNIX» Кернигана и Пайка. Он не появился в первом издании языка программирования C. Эта шутка является частью фольклора Функциональное программирование и уже была широко распространена в сообществе функционального программирования до публикации вышеупомянутых книг.
Еще одна шутка: «Чтобы понять рекурсию, вы должны понимать рекурсию». В англоязычной версии поисковой системы Google при поиске по запросу «рекурсия» сайт предлагает «Возможно, вы имели в виду: рекурсия». Альтернативная форма: Эндрю Плоткин : «Если вы уже знаете, что такое рекурсия, просто запомните ответ. В противном случае найдите кого-нибудь, кто стоит ближе к Дугласу Хофштадтеру, чем вы есть, а затем спросите его или ее, что такое рекурсия ".
Рекурсивные сокращения - другие примеры рекурсивного юмора. PHP, например, означает «Препроцессор гипертекста PHP», WINE означает «WINE - не эмулятор». GNU означает «GNU не Unix», и SPARQL обозначает «Протокол SPARQL и язык запросов RDF».
Канонический пример рекурсивно определенного набора задается натуральными числами :
В математической логике аксиомы Пеано (или постулаты Пеано или аксиомы Дедекинда – Пеано) являются аксиомами для натуральных чисел, представленных в XIX веке немецким математиком Ричардом Дедекиндом и итальянским математиком Джузеппе Пеано. Аксиомы Пеано определяют натуральные числа, относящиеся к рекурсивной функции-преемнику, а также сложение и умножение как рекурсивные функции.
Еще один интересный пример - это набор всех «доказуемых» утверждений в аксиоматической системе, которые определены в терминах процедуры доказательства. который индуктивно (или рекурсивно) определяется следующим образом:
Правила конечного подразделения являются геометрической формой рекурсии, который можно использовать для создания фрактальных изображений. Правило подразделения начинается с набора полигонов, помеченных конечным числом меток, а затем каждый полигон подразделяется на более мелкие помеченные полигоны способом, который зависит только от меток исходного многоугольника. Этот процесс можно повторять. Стандартный метод "средних третей" для создания набора Кантора является правилом подразделения, как и барицентрическое подразделение.
A функция может быть рекурсивно определена в терминах самой себя. Знакомый пример - последовательность числа Фибоначчи : F (n) = F (n - 1) + F (n - 2). Чтобы такое определение было полезным, оно должно быть сведено к нерекурсивно определенным значениям: в этом случае F (0) = 0 и F (1) = 1.
Известная рекурсивная функция - это Функция Аккермана, которая, в отличие от последовательности Фибоначчи, не может быть выражена без рекурсии.
Применение стандартной техники доказательства по случаям к рекурсивно определенным наборам или функциям, как в предыдущих разделах, дает структурную индукцию - мощное обобщение математической индукции, широко используемой для получения доказательств в математической логике и информационные технологии.
Динамическое программирование - это подход к оптимизации, который переформулирует задачу многопериодной или многоступенчатой оптимизации в рекурсивной форме. Ключевым результатом динамического программирования является уравнение Беллмана, которое записывает значение задачи оптимизации в более ранний момент (или на более раннем этапе) в терминах его значения в более позднее время (или более поздний этап).
В теории множеств это теорема, гарантирующая существование рекурсивно определенных функций. Для множества X, элемента a из X и функции теорема утверждает, что существует уникальная функция (где обозначает набор натуральные числа, включая ноль), такие что
для любого натурального числа n.
Возьмем две функции и так, чтобы:
, где a - элемент X.
С помощью математической индукции можно доказать, что для всех натуральные числа n:
По индукции для все .
Распространенный метод упрощения - разделение проблемы на подзадачи одного типа. Как метод компьютерного программирования, это называется разделяй и властвуй и является ключом к разработке многих важных алгоритмов. Разделяй и властвуй - это нисходящий подход к решению проблем, когда проблемы решаются путем решения меньших и меньших примеров. Противоположный подход - динамическое программирование. Этот подход служит восходящим подходом, когда проблемы решаются путем решения все более и более крупных экземпляров, пока не будет достигнут желаемый размер.
Классическим примером рекурсии является определение функции factorial, приведенное здесь в коде C :
unsigned int factorial (unsigned int n) {if (n == 0) {возврат 1; } else {вернуть n * факториал (n - 1); }}
Функция рекурсивно вызывает себя для меньшей версии ввода (n - 1)
и умножает результат рекурсивного вызова на n
, пока не достигнет базовый случай, аналогично математическому определению факториала.
Рекурсия в компьютерном программировании иллюстрируется, когда функция определяется в терминах более простых, часто меньших версий самой себя. Затем решение проблемы разрабатывается путем объединения решений, полученных из более простых версий проблемы. Одним из примеров применения рекурсии является парсеры для языков программирования. Большое преимущество рекурсии состоит в том, что бесконечный набор возможных предложений, схем или других данных может быть определен, проанализирован или произведен конечной компьютерной программой.
Отношения рекурсии - это уравнения, которые рекурсивно определяют одну или несколько последовательностей. Некоторые конкретные виды рекуррентных отношений могут быть «решены» для получения нерекурсивного определения (например, выражение в закрытой форме ).
Использование рекурсии в алгоритме имеет как преимущества, так и недостатки. Основное преимущество обычно - простота инструкции. Основным недостатком является то, что использование памяти рекурсивными алгоритмами может очень быстро расти, что делает их непрактичными для больших экземпляров.
Формы, которые, кажется, были созданы рекурсивными процессами, иногда появляются у растений и животных, например в разветвленных структурах, где одна большая часть разветвляется на две или более одинаковых меньших частей. Примером может служить брокколи Романеско.
Русская кукла или Матрешка - физический художественный пример рекурсивной концепции.
Рекурсия использовалась в картинах со времен Джотто Стефанески Триптих, Сделано в 1320 году. На его центральной панели изображен преклонивший колени кардинал Стефанески, держащий сам триптих в качестве подношения.
М. Галерея печати (1956) К. Эшера представляет собой гравюру, на которой изображен искаженный город, содержащий галерею, которая рекурсивно содержит изображение, и поэтому до бесконечности.
Еще примеры рекурсии: русские матрешки. Каждая кукла сделана из массива дерева или является полой и содержит внутри еще одну матрешку.
Викискладе есть медиафайлы, относящиеся к Рекурсия. |
Искать рекурсия или рекурсивность в Wiktionary, бесплатном словаре. |