- •Вопрос 1) Сравнительная характеристика декларативных и процедурных языков программирования
- •Вопрос 2) Предикаты. Предложения: факты и правила. (Prolog)
- •Вопрос 3) Переменные. Анонимные переменные. Конкретизация переменных Prolog
- •Унификация составных объектов
- •Использование знака равенства для унификации составных объектов
- •Унификация.
- •Сравнение термов.
- •Вопрос 4) Сопоставление и унификация. Предикат равенства. (Prolog)
- •Вопрос 5) Основные секции программы Prolog
- •Вопрос 6) Основные стандартные домены (Prolog)
- •Вопрос 7) Основные принципы поиска с возвратом. (Prolog)
- •Вопрос 8) Управление поиском решений(Prolog)
- •Вопрос 9) Простые и составные объекты данных
- •Унификация составных объектов
- •Использование знака равенства для унификации составных объектов
- •Использование нескольких значений как единого целого
- •Пример использования составных объектов
- •Вопрос 10) Аргументы множественных доменов. (Prolog )
- •Аргументы множественных типов
- •Вопрос 11) Рекурсия (Prolog)
- •Cхема вычисления факториала с помощью нисходящей стратегии рекурсии
- •12. Списки: объявление и примеры работы. (Prolog)
- •13. Строки. Работа со строками. (Prolog)
- •Вопрос 14) Метод отката после неудачи Prolog
- •Вопрос 15) Основы языка lisp. Символьные выражения: атомы и списки. (Lisp)
- •Вопрос 16) Базовые функции и предикаты. (Lisp)
- •Вопрос 17) Функции, определение функций.
- •Вопрос 18) простая рекурсия. (Lisp)
Вопрос 18) простая рекурсия. (Lisp)
Будем говорить, что рекурсия простая, если вызов функции встречается в некоторой ветви программы лишь один раз. Простой рекурсии в императивном программировании соответствует обыкновенный цикл.
Если в качестве результата функция возвращает значение другой функции, и рекурсивный вызов участвует в вычислении аргументов этой функции, то будем говорить о присутствии в функции рекурсии по аргументам.
Пример 1. Вычисление факториала натурального числа X. Поставленная задача решается с помощью функции, которая принимает значение, равное единице при равенстве аргумента нулю, а во всех остальных случаях равна произведению аргумента на значение этой же функции от аргумента, уменьшенного на единицу.
(DEFUN FACT (LAMBDA (X)
(COND ( (ZEROP X) 1 )
( T (* X (FACT (- X 1))) )
)
))
Текст этой функции можно взять здесь.
Пример 2. Функция COPY, которая строит копию самого "верхнего" уровня списка LST:
(DEFUN COPY (LAMBDA (LST)
(COND ( (NULL LST) NIL )
( T (CONS (CAR LST) (COPY (CDR LST))))
)
))
Текст этой функции можно взять здесь.
Построенная функция COPY является рекурсивной по аргументу, т.к. рекурсивный вызов является аргументом функции CONS. Функция COND в теле функции содержит две ветви: ветвь с условием окончания и ветвь с рекурсией, с помощью которой функция проходит список, копируя и укорачивая в процессе этого список по направлению CDR или, как говорят, в ширину.
Копирование списков представляет собой одно из основных действий над списками, и поэтому соответствующая функция входит в число встроенных функций практически во всех LISP-системах.
Пример 3. Определите функцию, удаляющую из списка последний элемент.
(DEFUN DROPLAST (LAMBDA (LST)
(REVERSE (CDR (REVERSE LST)))
))
Текст этой функции можно взять здесь.