Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Функцилональное программирование лекции 4 семес...docx
Скачиваний:
0
Добавлен:
10.01.2020
Размер:
45.66 Кб
Скачать

Циклические предложения

Что же нам здесь может предложить LISP?

(LOOP – циклический оператор. Например, мы хотим, чтобы данная функция вычисляла сумму всех чисел от 1 до заданного.

(defun add-int (n)) (let ((count1)(total1)) (loop (cond((equal count n) (return total))) (setq count (+1 count)) (setq (total(+total count)) ) ) )

(LOOP форма1 форма2…)

(defun @ИМЯ ФУНКЦИИ@ (ПаРАМЕТРЫ) (let (ИНИЦИАЛИЗАЦИЯ ПЕРМЕНОЙ ИНДЕКСА И РЕЗУЛЬТАТА) (loop (cond(Проверка индекса на выход) (return результат))) (изменение параметра счетчика) (другие изменения в переменной цикла, включая изменение переменной резулттата) ) ) )

Для итераций со списками LOOP так же можно использовать. Функция будет принимать список

(defun double list (list) (let ((newlist nil)) (loop (cond((null list)(return newlist))) (setq newlist(append newlist (list (*2 (car list))) ) (setq list (cdr list)) ) )

Лекция №4 (05.03.2013)

Оператор DO.

(DO ((VAR1 знач1 шаг1) ………….. (varK значК шагК)) (условие окончания форма 11…форма12…) Форма21 форма 22… )

Если выполняются условия – выполняются условия окончания. Если нет – то выполняются формы2…

DO TIMES

(DOTIMES (var num форма-return) (форма-тело) ) var – переменная цикла, num – форма, определяющая число циклов, return – результат, который должен быть возвращен.

При вычислении num-формы получаем некий count, а затем var меняется от 0 до count, не включая count, то есть ровно count раз.

Форма return может быть полезна, например, если необходимо вычислить среднее арифметическое значение элементов списка.

Рекурсия

Функция является рекурсивной, если в ней содержится вызов самой этой функции.

Функция MEMBER

(defun member1 (list item) (cond ((null list) nil) ((eql (car list) item) list) (t (member1(cdr list) item)) ) )

Численная рекурсия - нужна, например, для нахождения всех первых N натуральных чисел.

(defun summall (n) (cond ((zerop n) 0) (T (+ n (sumall(- n 1)))) ) )

Как писать рекурсивные функци??? Прочесть самому!

Формирование списка, содержащего только отрицательные элементы исходного

(defun negnumS (a) (cond ((null a) nil) ((< (car a) 0)(cons (car a) (negnums (cdr a)))) (T (negnums(cdr a))) ) )

Разобрать задачу о волке, козе и капусте. При помощи книги Крюгера.

Функции-функционалы

Функционал – функция, имеющая функциональный аргумент.

Отображающий функционал.

(MAPCAR f ‘(x1 x2….xN))

Результатом работы мапкар будет список, сформированный следующим образом:

((f x1) (f x2) (f x3) … (f xN))

*(mapcar ‘add1 ‘1 2 3))

(2 3 4)

Аргументов может быть несколько. Например, можно определить следующую функцию:

(defun addlist (l1 l2) (mapcar ‘+ l1 l2) )

*(addlist ‘(1 2 3) ‘(3 4 5))

(4 6 8)

Лямбда-выражения

*(mapcar ‘(lambda (x) (+ 1 x)) ‘(1 2 3))

2 5 10

*(addlist ‘(1 2 3) ‘(3 4 5))

(4 6 8)

Свойства символов

Список свойств PropertyList, который для конкретного символа Mary представляет собой следующую таблицу:

Mary

age

28

acceptation

Lawyer

Salery

90

children

Bill Alice Susan

Свойство Значение

Список свойств Мэри выглядит таким образом: на нечетных местах стоят названия свойств, на четных местах – их значения.

(age 28 occupation lawyer sabary 90 children (Bill Alice Susan))

(GET <Символ> <свойство>)

*(get ‘Mary ‘Age) 28

(SETF (GET <Символ> <Свойство>) <Значение>)

(PUTPROP <Символ><Значение><Свойство>)

*(putprop ‘Marry ‘Cinema ‘Hobby) – Добавляет новое свойство hobby. Помещается в начале списка.

Удаление свойства

(REMPROP <символ> <Свойство>)

(SYMBOL-PLIST <символ>) – в качестве результата – список.