Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные по Лисп.doc
Скачиваний:
4
Добавлен:
26.09.2019
Размер:
74.75 Кб
Скачать

Лаб 1.

Рекурсивная обработка числовой информации.

Задание 1: Подсчитать сумму квадратов целых чисел в заданном интервале значений от M до N включительно.

(defun SumSqr (m n) (cond ((eq n m) (* m m)) ((> m n) (+ (* m m) (SumSqr n (- m 1)))) (T (+ (* n n) (SumSqr m (- n 1)))) ) )

-----------------------------------------------------------------

Задания 2-3: Определить НОД и НОК двух чисел.

(defun RunNod (n m) (cond ((= n m) n) ((< n m) (RunNod n (- m n))) (T (RunNod m (- n m))) ) )

(defun NOD (n m) (cond ((not (numberp n)) 'n:non-number) ((not (numberp m)) 'm:non-number) ((< n 0) 'n:non-positive) ((< m 0) 'm:non-positive) (T (RunNod n m)) ) )

(defun RunNok (n m) (/ (* n m) (Nod n m)) )

(defun NOK ( n m ) (cond ((not (numberp n)) 'n:non-number) ((not (numberp m)) 'm:non-number) ((< n 0) 'n:non-positive) ((< m 0) 'm:non-positive) (T (RunNOK n m)) ) ) (rds)

----------------------------------------------------------------

Задание 4: Вычислить квадратный корень из заданного числа.

(defun RunSqrt (l r n temp) (( setq temp (* (/ (+ l r) 2) (/ (+ l r) 2) )) (cond ( (< (abs (- temp n)) 0.00001) (/ (+ l r) 2)) ( (< temp n ) (RunSqrt (/ (+ l r) 2) r n )) (T (RunSqrt l (/ (+ l r) 2) n)) ) ) )

(defun SQRT (n) (cond ((NOT (Numberp n)) 'non-number) ((>= n 0) (RunSqrt 0 n n )) (T 'Negative!!) ) )

(RDS)

-------------------------------------------------------------------

Задание 5: Первые два члена ряда Фибоначчи равны 1 и 2. Каждый следующий член равен сумме двух предыдущих. Определить функцию, вычисляющую N-й член ряда Фибоначчи.

(defun RunFibo (N prev) (cond ((eq n 1) (cons 1 0)) ((eq n 2) (cons 2 1)) (T (setq prev (RunFibo (- N 1))) ( cons ( + (car prev) (cdr prev)) (car prev)) ) ) )

(defun Fibo (N) (cond ((not (numberp n)) 'non-number!!) ((<= n 0) 'non-positive!!) (T (car (RunFibo N))) ) )

(rds)

Лаб 2.

Рекурсивная обработка списковой информации.

Задание 6: Определить предикат, распознающий списки, имеющие четное количество элементов. Запускать (EvenList ...).

(defun RunEvenList (L n) (cond ((Null L) (evenP n )) (T (RunevenList (cdr l) (+ n 1) )) ) )

(defun EvenList (L) (cond ((not (listp L)) 'non-list) ((null l) T) ( T (RunEvenList L 0)) ) )

(rds)

-----------------------------------------------------------------

Задание 7: Подсчитать сумму всех числовых атомов в списке произвольной структуры. Запускать (CountNumAtoms ...).

(defun CountNumAt (l) (cond ((Null l) 0) ((listp (car l)) (+ (CountNumAt (car l)) (CountNumAt (cdr l)) )) (T (If (NumberP (car L)) (+ (car l) (CountNumAt (cdr l))) (CountNumAt (cdr l)))) ) )

(defun CountNumAtoms (L) (cond ((not (listp l)) 'non-list!!) ((Null L) nil) (T (CountNumAt L)) ) )

(RDS)

-----------------------------------------------------------------

Задание 8: Определить максимальную глубину списка произвольной структуры. Запускать (MaxDepth..).

(defun RunMAXDEPTH (L X) (COND ((NULL l) X ) ((ATOM (CAR L)) (RunMAXDEPTH (CDR L) X)) (T (IF (< X (RunMAXDEPTH (CAR L) (+ X 1))) (SETQ X (RunMAXDEPTH (CAR L) (+ X 1)) ) ) (RunMAXDEPTH (CDR L) X) ) ) )

(defun MaxDepth (L) (cond ((Not (List L)) 'non-list!!) (T (RunMaxDepth L 0)) ) )

(rds)

----------------------------------------------------------------

Задание 9: Найти максимальный элемент в списке произвольной структуры. Запускать (MaxMem ...)

(defun RunMaxMem (L ) (cond ((null (cdr l)) (if (Numberp (car l)) (car l) (RunMaxMem(car l)))) (T (if (< (RunMaxMem(car l)) (RunMaxMem (cdr l) )) (RunMaxMem (cdr l)) (RunMaxMem (car l)) ) ) ) )

(defun MaxMem (L) (cond ((not (listp L)) 'non-list) ((null L) nil) (T (RunMaxMem L)) ) ) (rds)

-------------------------------------------------------------------

Задание 10: Написать функцию, выполняющую вычисление арифметических выражений, заданных в виде списка. Используемые операции - умножить (*), разделить (/), сложить (+), вычесть (-). При вычисении учитывать приоритет операций и скобочные выражения. (Запускать (Evaluate '( 3 + 5 * 6))).

(defun RunEvaluate (l) (Cond ((Null (Cdr L)) (If (ListP (Car L)) (RunEvaluate (Car L)) (Car L))) ( (ListP (Car L)) (Setq L (Append (List (funcall (Cadr L) (RunEvaluate (Car L)) (RunEvaluate (caddr L)))) (cdddr L) ) ) (RunEvaluate L) ) (T (Setq L (Append (List (funcall (Cadr L) (Car L) (RunEvaluate (caddr L)))) (cdddr L) ) ) (RunEvaluate L)) ) )

(defun FindSubL (L NoCheck) (if (Null NoCheck) (setq L (append (list (CheckIt (Car L))) (cdr l)))) (cond ((Null L) Nil) ( (or (eq (cadr L) "*" ) (eq (cadr L) "/" ) ) (Append (list (car L) (cadr L) ) (FindSubL (cddr L)) ) ) (T (List (Car L))) ) )

(defun GetPastSubL (L) (cond ((Null (cdr L)) Nil) ( (or (eq (cadr L) "*" ) (eq (cadr L) "/" ) ) (GetPastSubL (cddr L)) ) (T (cdr L)) ) )

(defun CheckIt (L) (Cond ((Null L) Nil) ((Atom L) L ) (T (CrPar L)) ) )

(defun CrPar (L NoCheck) (if (Null NoCheck) (setq L (append (list (CheckIt (Car L))) (cdr l)))) (cond ((null (cdr L)) L) ((or (eq (cadr L) "*" ) (eq (cadr L) "/" ) ) (setq L (Cons (FindSubL L NoCheck) (GetPastSubL L))) (CrPar L 1) ) (T (append (list (car L) (cadr L) ) (CrPar (cddr L)) ) ) ) )

(defun Check (L NoCheck) (cond ((And (Not (NumberP (Car L))) (Not (List (Car L)))) Nil) ((And (ListP (Car L)) (Null NoCheck)) (And (Check (Car L)) (Check L 1))) ((Null (cdr L)) T ) ((Null (cddr L)) nil) ((or (eq (cadr L) '+ ) (eq (cadr L) '- ) (eq (cadr L) '* ) (eq (cadr L) '/ )) (Check (cddr L)) ) (T nil) ) )

(defun Evaluate (L) (cond ((not( listp L)) "non-list") ((null L) nil) ((not (Check L nil)) "error-data") (T (setq L(CrPar L )) (RunEvaluate L) ) ) )

(rds)

Лаб 3