
- •1. Предмет ии Хар-ка понятия интеллектуальности
- •2.Декларат и процедур.
- •3.Понятие предиката.Логика рассуждений.
- •4.Структура программы(разделы в языке пролог)
- •5.Понятие цели, внутренняя и внешняя
- •6.Факты и правила
- •7.Откат и отсечение
- •8.Организация рекурсии
- •9.Вычисление частичных сумм рядов
- •10.Списки в турбопрологе
- •11.Списки в лиспе
- •13.Определение функции в лиспе
- •14.Рекурсии в лиспе
14.Рекурсии в лиспе
Лисп специально создавался для рекурсивных вычислений, и вся сила языка как раз и заключена в возможности широкого использования рекурсивных функций. К примеру вычисления факториала:
(defunfactorial (n)
(cond ((zeropn) 1)
(t (* (factorial (- n i)) n))))
Процесс рекурсивных вызовов можно исследовать, используя возможности трассировки. Включение и выключение механизма трассировки выполняется с помощью входящих в состав интерпретатора директив TRACE и UNTRACE:
Рис. 1. Схема рекурсивных вызовов при вычислении факториала числа 4 .
Лисп позволяет также эффективно определять рекурсивные функции для обработки символьных данных. Определим упрощенную версию функции MEMBER. Чтобы отличать ее от функции, встроенной в систему назовём ее MY-MEMBER. Функция проверяет, входит ли элемент X в список Y и возвращает подсписок Y, который начинается с обнаруженного элемента:
(defun my-member (x у)
(cond ((null у) nil)
((equal x (first у)) у)
(t (my-member x (rest у)))))
В функции выполняется сравнение элемента X с первым элементом списка Y. Если обнаруживается совпадение, то функция возвращает список У. Если совпадение не обнаружено, то продолжается поиск элемента X в хвосте списка У. Для этого рекурсивно вызывается функция MY-MEMBER. Первое условие формы COND на каждом шаге рекурсии контролирует список У. Если этот список исчерпан, то определяемая функция MY-MEMBER возвратит значение NIL. Функция MY-MEMBER использует простую рекурсию.
Примером функции, выполняющей символьную обработку и основанной на параллельной рекурсии, может служить рекурсивная версия функции MY-INTERSECTION:
(defun my-intersection (a b) (cond
((null a) nil) ;1)
((member (first a) b) ;2)
(cons (first a)(my-intersection (rest a) b))) (t (my-intersection (rest a) b)))) ;3)
Данная функция вычисляет список общих элементов двух списков А и В. В определении функции реализованы три правила:
если список А исчерпан, то список общих элементов пустой;
если первый элемент списка А входит в список В, то этот элемент
добавляется к списку общих элементов списков (REST А) и В; такой
список формируется рекурсивным вызовом функции MY- INTERSECTION, применяемой к хвосту списка А и исходному списку В;
если первый элемент списка А не входит в список В, то строится список общих элементов из хвоста списка А и списка В с помощью рекурсивного вызова функции MY-INTERSECTION.