Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лисп.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.66 Mб
Скачать

18.Другие виды рекурсии.

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

1) параллельная рекурсия, когда тело определения функции f содержит вызов некоторой функции g, несколько аргументов которой являются рекурсивными вызовами функции f:

(defun f ...

...(g...(f ...)... (f ...)...)

...)

2) взаимная рекурсия, когда в определении функции f вызывается некоторая функция g, которая в свою очередь содержит вызов функции f:

(defun f ...

...(g...)...)

(defun g ...

...(f...)...)

3) рекурсия более высокого порядка, когда аргументом рекурсивного вызова является рекурсивный вызов:

(defun f ...

...(f...(f ...)...)

...)

Рекурсию называют параллельной, если она встречается одновременно в нескольких аргументах функции.

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

Вложенный цикл можно выразить и с помощью циклических предложений или специализированных повторяющих функций.

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

Программирование вложенных циклов возможно в такой форме, при которой в определении функции рекурсивный вызов является аргументом вызова этой же самой функции. В такой рекурсии можно выделить различные порядки (order) в соответствии с тем, на каком уровне рекурсии находится вызов. Такую форму рекурсии будем называть рекурсией более высокого порядка. Функции, которые мы до сих пор определяли, были функциями с рекурсией нулевого порядка.

В качестве примера функции с рекурсией первого порядка приведем функцию В-ОДИН-УРОВЕНЬ, располагающую элементы списка на одном уровне, которую мы ранее определили, используя параллельную рекурсию:

В этом определении работа функции непосредственно сведена к базовым функциям и рекурсии первого порядка, гдеаргументом рекурсивного вызова является один рекурсивный вызов. В более раннем определении дополнительно к базовым функциям и рекурсии нулевого порядка мы использовали функцию APPEND. Применяя рекурсию более высокого порядка вычисления можно представить более абстрактно и с помощью более короткого определения, однако представить себе работу такой функции довольно сложно.

19.Функции более высокого порядка.

Аргумент, значением которого является функция, называют в функциональном программировании функциональным аргументом, а функцию, имеющую функциональный аргумент - функционалом.

Различие между понятиями "данные" и "функция" определяется не на основе их структуры, а в зависимости от их использования.

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

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

Далее мы будем использовать понятия функции, вызова функции и значения функции в следующем смысле:

1) Функция сама есть изображение вычислений или определение.

2) Вызов функции есть применение этого изображения.

3) Значение функции есть результат такого применения.

Функция является функционалом, если в качестве ее аргумента используется лисповский объект типа (1), который интерпретируется как функция (2) в теле функционала. Таким функциональным объектом может быть

1) символьное имя, представляющее определение функции (системная функция или функция, определенная пользователем),

2) безымянное лямбда-выражение,

3) так называемое замыкание.

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

Аргументом функции может быть функция, однако, функция может быть и результатом. Такие функции называют функциями с функциональным значением (function valued). Функционал также может быть с функциональным значением. Вызов такого функционала возвращает в качестве результата новую функцию, в построении которой, возможно, используются функции, получаемые функционалом в качестве аргументов. Такие функционалы мы будем называть функционалами с функциональным значением.

Вызов функции с функциональным значением или другая форма с функциональным значением может в вызове функции находиться в двух различных позициях:

1) функционального аргумента в вызове функционала;

2) на месте имени функции в вызове функции (или функционала, или функции с функциональным значением).

В Коммой Лиспе предполагается, что в вызове функции на месте имени функции находится символ, определенный с помощью формы DEFUN как имя функции. Переданный в качестве параметра функциональный объект можно использовать лишь через явный вызов применяющих функционалов (FUNCALL, APPLY).

функций

Все типы функций, могут быть использованы в определениях (лямбда- выражениях) в следующих позициях:

1. Обыкновенный вызов:

(defun f ...

...(g...)...)

2. Рекурсивный вызов:

(defun f ...

...(f ...)...)

3. Вложенный рекурсивный вызов:

(defun f ...

...(f...(f ...)...)...)

4. Функциональный аргумент:

(defun f(... g...)

... (apply g ...) ...)

Аргументами функций были данные, выражения, значением которых являются данные или, как в случае функций более высокого порядка, другие функции.

Объединяя использование рекурсии и функционалов, получим еще один способ использования, когда функция принимает саму себя в качестве функционального аргумента:

5. Рекурсивный функциональный аргумент:

(defun f(...f...)

... (apply f ... f ...) ...)

Получающий себя в качестве аргумента функционал называют применяемым к самому себе или автоаппликативной (self-applicative, auto-applicative) функцией. Соответственно функцию, возвращающую саму себя, называют авторепликативной (self-replicative, auto- repljcative). Часто говорят и о самовоспроизводящихся (self-reproducing) функциях.

Автоаппликативные и авторепликативные функции образуют класс автофункций (auto-function). Автофункции на самом деле не получают в качестве параметра и не возвращают в качестве результата буквально самих себя, а лишь используют или копируют себя.

Функционалы и функции с функциональным значением (типы 4 и 5) в отличие от обыкновенных функций 1, 2, 3), получающих в качестве аргументов и возвращающих в качестве значения данные или выражения, значением которых являются данные, называются функциями более высокого порядка (higher order). Обыкновенные функции независимо от того, рекурсивные они или нет, являются функциями первого порядка.

Функции более высокого порядка открывают новые возможности для программистов, позволяя сложные вычисления записывать более коротко. Многие вещи, которые в традиционных языках или при традиционном подходе трудно или практически невозможно запрограммировать, можно определить яснее и короче, используя различные типы функционалов и функции с функциональным значением.

Передача функции в качестве параметра другой функции и создание функции с помощью специальных форм составляет основу для новых технологий программирования, таких, например, как программирование, управляемое данными (data driven programming), и объектно-ориентированное программирование (object programming). Функции более высокого порядка тесно связаны с замыканиями и макросами, а также с частичными (partial evaluation) и отложенными вычислениями (lazy evaluation).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]