Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Lisp / Filp / LAB1(каменты)

.DOC
Скачиваний:
21
Добавлен:
15.06.2014
Размер:
41.98 Кб
Скачать

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ

КАФЕДРА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

ОТЧЕТ

ПО ПРЕДМЕТУ

“ФУНКЦИОНАЛЬНОЕ И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ”

ПО ЛАБОРАТОРНЫМ РАБОТАМ №1, №2, №3

Выполнил: студенты группы №851003 Проверил:

Машара О.Г., Куликов С.С. Северенцева О.Н.

Минск, 2001

Лабораторная работа №1.

  1. Задание.

В простом списке чисел заменить все отрицательные числа нулями.

  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)

  1. Результаты проверки работоспособности.

$ (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.

  1. Задание.

Даны натуральные m, n и некоторый список. Удалить из списка все элементы с номерами с m-го по n-й.

  1. Текст программы.

(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)

  1. Результаты проверки работоспособности.

$ (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.

  1. Задание.

Удалить все ненулевые элементы из простого списка чисел.

  1. Текст программы.

( 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)

  1. Результаты проверки работоспособности.

$ (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) – логические И

Рекурсия.

Функция является рекурсивной, если в её определении содержится вызов самой этой функции. Рекурсия по значению – вызов является выражением, определяющим результат функции. Если же в качестве результата функции возвращается значение некоторой другой функции и рекурсивный вызов участвует в вычислении аргументов этой функции, то говорят о рекурсии по аргументам.

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

Соседние файлы в папке Filp