
- •II вопрос
- •Формулировку рекурсивного определения
- •Программную реализацию на языке lisp
- •На Лиспе решить задачу переворачивания данного списка.
- •На Лиспе решить задачу получения длины списка.
- •На Лиспе решить задачу получения начала непустого списка.
- •На Лиспе решить задачу нахождения пересечения двух списков-множеств.
- •На Лиспе решить задачу объединения двух списков-множеств.
- •На Лиспе решить задачу получения разности двух списков-множеств.
- •На Лиспе решить задачу проверки двух списков на множественное равенство.
- •На Лиспе решить задачу проверки, является ли одно множество подмножеством другого.
- •На Лиспе реализовать функцию нахождения нод двух натуральных чисел.
- •На Лиспе реализовать функцию нахождения суммы элементов списка.
- •На Лиспе реализовать функцию нахождения максимального элемента списка.
- •На Лиспе реализовать функцию подсчета количества вхождений данного элемента в список.
- •На Лиспе реализовать задачу проверки вхождения данного элемента в список.
- •На Лиспе реализовать функцию вычисления факториала.
- •На Лиспе реализовать функцию добавления элемента в упорядоченный список, не нарушая упорядоченности.
- •На Лиспе реализовать функцию сортировки списка.
- •На Лиспе реализовать функцию удаления всех элементов e из списка.
- •На Лиспе реализовать функцию нахождения последнего элемента непустого списка.
- •На Лиспе реализовать функцию нахождения n-го числа Фибоначчи
На Лиспе решить задачу проверки двух списков на множественное равенство.
Определение: Равенство двух списков-множеств L и R это
если L пусто, то результат есть результат проверки на пустоту R;
если голова L входит в R, то результат есть результат проверки на равенство хвоста L и списка R, из которого исключена голова L;
в остальных случаях множества не равны.
*Понадобится дополнительная функция «элемент E входит в список L» (см. выше) и функция удаления элемента E из списка L:
(defun my_remove (E L)
(cond
((null L) nil)
((= E (car L)) (my_remove E (cdr L)))
(T (cons (car L) (my_remove E (cdr L))))
)
)
(defun EQ_SET (L R)
(cond
((null L) (NULL r))
((MY_MEMBER (car L) R) (EQ_SET (cdr L) (MY_REMOVE (CAR L) R)))
(T NIL)
)
)
На Лиспе решить задачу проверки, является ли одно множество подмножеством другого.
Определение: Проверка, является ли список-множество L подмножеством списка-множества R:
если L пусто, то результат – является (истина);
если голова L входит в R, то результат есть результат проверки, является ли хвост L подмножеством R;
в остальных случаях L не является подмножеством R (ложно).
*Понадобится дополнительная функция «элемент E входит в список L» (см. выше).
(defun subSET (L R)
(cond
((null L) t)
((MY_MEMBER (car L) R) (subSET (cdr L) R))
(T NIL)
)
)
На Лиспе реализовать функцию нахождения нод двух натуральных чисел.
Определение: Наибольший общий делитель (НОД) двух натуральных чисел А и В это
если В = 0, то результат А;
иначе результат – НОД В и остатка от деления А на В.
*Понадобится дополнительная функция «получение остатка от деления А на В»:
(DEFUN MOD(A B)
(COND
((< A B) A)
(T (MOD (- A B) B))
)
)
(DEFUN NOD(A B)
(COND
((= B 0) A)
(T (NOD B (MOD A B)))
)
)
На Лиспе реализовать функцию нахождения суммы элементов списка.
Определение: СУММА элементов списка - это
0, если список пустой;
голова списка, добавленная к сумме элементов хвоста списка в противном случае.
(defun mysum (L)
(cond
((null L) 0)
(T (+ (car l) (mysum (cdr l))))
)
)
На Лиспе реализовать функцию нахождения максимального элемента списка.
Определение:
если список пуст – вернуть nil;
если список состоит из одного элемента, максимальный элемент - голова списка;
в остальных случаях - максимальное значение из головы списка и максимального элемента хвоста.
*Есть встроенная функция max, но можно написать и свою.
(defun mymax (l)
(cond
((null l) nil)
((null (cdr l)) (car l))
(T (max (car l) (mymax (cdr l))))
)
)