
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
КАФЕДРА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
ОТЧЕТ
ПО ПРЕДМЕТУ
“ФУНКЦИОНАЛЬНОЕ И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ”
ПО ЛАБОРАТОРНЫМ РАБОТАМ №1, №2, №3
Выполнил: студенты группы №851003 Проверил:
Машара О.Г., Куликов С.С. Северенцева О.Н.
Минск, 2001
Лабораторная работа №1.
-
Задание.
В простом списке чисел заменить все отрицательные числа нулями.
-
Текст программы.
( DEFUN LAB1 (LIST_X)
( COND
; если список пуст - прекращаем вычисление
( (NULL LIST_X) NIL )
; если список не пуст
; формируем новый
( ( CONS
( COND
; если текущая голова списка меньше нуля
; то ей присваивается нулевое значение;
; результатом данного действия будет голова списка
( (< (CAR LIST_X) 0) 0) ( (CAR LIST_X) )
)
; в рекурсию передаём хвост списка
( LAB1 (CDR LIST_X) )
)
)
)
)
(LAB1 '(1 3 5 -3 -4 5 6 7))
(RETURN)
-
Результаты проверки работоспособности.
$ (LAB1 ‘(1 3 5 –3 –4 5 6 7))
(1 3 5 0 0 5 6 7)
$ (LAB1 ‘(1 2 3))
(1 2 3)
$ (Lab1 ‘(–1 –2 –5 –7))
(0 0 0 0)
$ (LAB1 ‘(0 1 –1 0 2 –2 0 3 –3 0 0 0 0 0 0 0 0))
(0 1 0 0 2 0 0 3 0 0 0 0 0 0 0 0 0))
Лабораторная работа №2.
-
Задание.
Даны натуральные m, n и некоторый список. Удалить из списка все элементы с номерами с m-го по n-й.
-
Текст программы.
(DEFUN LAB2 (LIST_X M N)
( COND
; если список пуст - прекращаем вычисления
( (NULL LIST_X) NIL )
; если список не пуст
( ( COND
; данная строка осуществляет удаление элементов списка;
; она означает, что рекурсивное формирование нового
; списка подошло к началу диапазона удаляемых элементов
; или находится внутри него; если выбирается это
; выражение, то головной элемент текущего списка удаляется
; (отсекается) и в рекурсию передаётся хвост списка
( (AND (< M 2) (> N 0)) (LAB2 (CDR LIST_X) (- M 1) (- N 1)) )
; данный код производит объединение (рекурсивное)
; элементов списка, не подлежащих удалению
( (
CONS (CAR LIST_X) (LAB2 (CDR LIST_X) (- M 1) (- N 1))
)
)
)
)
)
)
; вызов функции
(LAB2 '(3 4 5 1 5 3 F V D E A H S E F ) 2 6 )
(RETURN)
-
Результаты проверки работоспособности.
$ (LAB2 ’(3 4 5 1 5 3 F V D E A H S E F)) 2 6)
(3 F V D E A H S E F)
$ (LAB2 ’(1 2 3 4 5) 1 3)
(4 5)
$ (LAB2 ’(1 2 3 4 5 6) 3 6)
(1 2)
Лабораторная работа №3.
-
Задание.
Удалить все ненулевые элементы из простого списка чисел.
-
Текст программы.
( DEFUN LAB3 (LIST_X)
( COND
; если список не пуст
((NOT (NULL LIST_X)) ( COND
; если текущая голова списка равна
; нулю - отсекаем её
((= (CAR LIST_X) 0) (LAB3 (CDR LIST_X)) )
; иначе рекурсивно объединяем
; оставшиеся ненулевые элементы
( (CONS
(CAR LIST_X) (LAB3 (CDR LIST_X))
)
)
)
)
)
)
(LAB3 '(1 3 5 0 0 0 2 0 5 0 1))
(RETURN)
-
Результаты проверки работоспособности.
$ (LAB3 ’(1 3 5 0 0 0 2 0 5 0 1))
(1 3 5 2 5 1)
$ (LAB3 ’(0 0 0))
NIL
$ (LAB3 ’(0 1 2 3))
(1 2 3)
Примечания к лабораторным работам №1, №2, №3.
Данные лабораторные работы показывают преимущества работы со списками на языке Lisp. Практически, Lisp позволяет осущесталять со списками любые операции, как с помощью встроенных функций, так и с помощью функций, определённых пользователем.
Рекурсивное построение программ более универсально, чем использование циклов, по крайней мере для задач, решение которых осуществляется с помощью языка Lisp.
Краткие теоретические сведения.
Селекторы.
(CAR список) – головная часть списка
(CDR список) – хвостовая часть списка
Построение и копирование списка.
(CONS голова хвост) – присоединение головы к списку
Анализ списков.
(NULL объект) – пустой список
Определение функций.
(DEFUN имя лямбда-сисок тело) – присвоение имени и определение новой функции
Разветвление вычислений.
(COND (предикат1 выражение1) … (предикатN выражениеN)) – условное предложение
Логические значения.
NIL – ложь
(AND условие1 условие2 … условиеN) – логические И
Рекурсия.
Функция является рекурсивной, если в её определении содержится вызов самой этой функции. Рекурсия по значению – вызов является выражением, определяющим результат функции. Если же в качестве результата функции возвращается значение некоторой другой функции и рекурсивный вызов участвует в вычислении аргументов этой функции, то говорят о рекурсии по аргументам.
Рекурсия простая, если вызов функции встречается в некоторой ветви лишь один раз. Простой рекурсии в процедурном программировании соответствует обыкновенный цикл. Рекурсию называют параллельной, если она встречается одновременно в нескольких аргументах функции. Так выглядят повторяющиеся вычисления, соответствующие следующим друг за другом (текстуально) циклам в операторном программировании.