- •Вопрос 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)
Вопрос 11) Рекурсия (Prolog)
Рекурсия - один из основных приёмов программирования в декларативных языках, какими являются Пролог и Лисп. Предикат или функция называются рекурсивными, если они ссылаются на самих себя. При этом задача разбивается на части все меньшего и меньшего размера до тех пор, пока они не станут настолько малы, что их решение не будет сводиться к набору из одной или нескольких простейших операций.
Обычно рекурсивная программа состоит как минимум из двух частей:
граничного условия, при котором рекурсия останавливается;
рекурсивного условия, при котором в описание функции или предиката входит и сама функция или предикат.
Механизм рекурсии часто объясняют на вычислениях чисел Фибоначчи, первые 10 которых приведены в таблице:
Числа Фибоначчи (первые 10 значений) |
|||||||||||
Номер числа Фибоначчи |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
Значение числа Фибоначчи |
1 |
1 |
2 |
3 |
5 |
8 |
13 |
21 |
34 |
55 |
89 |
Здесь каждое следующее число представляет собой сумму двух предыдущих чисел.
Эти числа могут быть определены следующим соотношением:
fib(0) = 1
fib(1) = 1
fib(n) = fib(n-1) + fib(n-2)
На Прологе это соотношение будет выглядеть так:
predicates
fib(integer,integer)
clauses
fib(0,1). % граничное условие
fib(1,1). % граничное условие
fib(N,F) :- N>1,
N1=N-1,
fib(N1,F1),
N2=N-2,
fib(N2,F2),
F=F1+F2.
Теперь Goal: fib(10,X).
89
На рисунке представлена схема вычисления числа Фибоначчи с помощью рекурсии.
Другая функция, вычислять которую удобно с применением рекурсии, - это факториал числа N (записывается N!, произносится "эн-факториал"). По определению, 0! равен 1. Остальные значения определяются формулой:
N!=N·(N-1) · (N-2) ·…·2·1.
Первые десять значений факториала |
|||||||||||
N |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
N! |
1 |
1 |
2 |
6 |
24 |
120 |
720 |
5040 |
40320 |
362880 |
3628800 |
Рекурсивно функцию факториала можно описать так:
0!=1
N!=N*(N-1) для N>0
Программа, реализующая функцию факториала числа n! в Прологе, выглядит так:
predicates
fact (integer, real)
clauses
fact.(N,F):-N<0,!,fail.
fact(0,1).
fact(N,F):-N1=N-1,
fact(N1,F1),
F=F1*N.
Зададим затем Goal: fact(4, X) и получим решение: Х=24 1 Solution