Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Косвенная рекурсия, пример

Основные задачи для функционального и логического программирования. | Основные примитивы Лиспа для обработки списка. | Применяющий функционал Лиспа | Генератор в программировании, понятие вычислительного контекста | Теория Тьюринга, значение для логического программирования. | Сопоставление в логическом программировании | Переменная, конкретизация переменных | Процедура вывода решения, как процедура доказательства теоремы | Определение оператора и его свойства. | Запись списка в виде структуры |


Читайте также:
  1. III. Программа и тестовые примеры
  2. III. Программа и тестовые примеры
  3. III. Программа и тестовые примеры
  4. III. Программа и тестовые примеры
  5. IV. Примеры анализа рекламных сообщений
  6. IV.Индивидуальная работа с учащимися (пример)
  7. Аллах привел в качестве примера о верующих жену

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

является также взаимно рекурсивной. Рассмотрим в качестве примера следующую задачу. Определить предикат, проверяющий, содержит ли список четное число элементов на верхнем уровне, и предикат, проверяющий список на нечетность числа элементов. Декларативное описание задачи следующее:

 пустой список четный;

 у четного списка нечетный хвост;

 у нечетного списка четный хвост

ЛИСП: >(defun even1 (l)

(cond

((null l) t); пустой список четный

(t (number1 (cdr l))))); у четного списка нечетный хвост

EVEN1

>(defun number1 (l)

(cond

((null l) nil); пустой список − не нечетный

(t (even1 (cdr l))))); у нечетного списка четный хвост

NUMBER1

>(even1 ‘(1 2 3 4))

T

>(even1 ‘(1 2 3))

NIL

>(number1 ‘(1 2 3 4))

NIL

>(number1 ‘(1 2 3))

T

На Эрланге следующее определение:

even1(L) when L==[] -> true;

even1([_|T]) -> number1(T).

number1(L) when L==[] -> false;

number1([_|T]) -> even1(T).

1> recc:even1([1,2,3]).

false

2> recc:even1([1,2,3,4]).

true

3> recc:number1([1,2,3,4]).

False

 


Дата добавления: 2015-07-19; просмотров: 100 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Рекурсия по аргументу, пример| Реализация рекурсивного вызова, функция трассировки в Лиспе

mybiblioteka.su - 2015-2024 год. (0.006 сек.)