
- •II вопрос
- •Формулировку рекурсивного определения
- •Программную реализацию на языке lisp
- •На Лиспе решить задачу переворачивания данного списка.
- •На Лиспе решить задачу получения длины списка.
- •На Лиспе решить задачу получения начала непустого списка.
- •На Лиспе решить задачу нахождения пересечения двух списков-множеств.
- •На Лиспе решить задачу объединения двух списков-множеств.
- •На Лиспе решить задачу получения разности двух списков-множеств.
- •На Лиспе решить задачу проверки двух списков на множественное равенство.
- •На Лиспе решить задачу проверки, является ли одно множество подмножеством другого.
- •На Лиспе реализовать функцию нахождения нод двух натуральных чисел.
- •На Лиспе реализовать функцию нахождения суммы элементов списка.
- •На Лиспе реализовать функцию нахождения максимального элемента списка.
- •На Лиспе реализовать функцию подсчета количества вхождений данного элемента в список.
- •На Лиспе реализовать задачу проверки вхождения данного элемента в список.
- •На Лиспе реализовать функцию вычисления факториала.
- •На Лиспе реализовать функцию добавления элемента в упорядоченный список, не нарушая упорядоченности.
- •На Лиспе реализовать функцию сортировки списка.
- •На Лиспе реализовать функцию удаления всех элементов e из списка.
- •На Лиспе реализовать функцию нахождения последнего элемента непустого списка.
- •На Лиспе реализовать функцию нахождения n-го числа Фибоначчи
II вопрос
Ответ на вопрос включает:
Формулировку рекурсивного определения
Программную реализацию на языке lisp
Базовые примитивы обработки списков
Функция QUOTE – блокирует вычисление своего аргумента. Аргументом функции QUOTE может быть что угодно – список или атом.
( QUOTE (1 2 3)) или (1 2 3) результат ' (1 2 3) (1 2 3) результат
Функция CAR – возвращает голову непустого списка. Головой непустого списка называют первый элемент этого списка. Для пустого списка понятие головы не определено.
(CAR ' (1 2 3)) 1 результат
(CAR ' ((1) (2) (3))) (1) результат
*Большинство функций вычисляет свои аргументы, поэтому блокируем аргумент-список.
Функция CDR – возвращает хвост непустого списка. Хвост — это часть списка, без первого элемента, т.е. без головы. Результатом функции CDR всегда является список. CDR возвращает пустой список в том случае, если ее аргумент является одноэлементным списком. Для пустого списка значение функции CDR не определено.
(CDR '(1 2 3))
(2 3)
(CDR '(1 (23)))
((2 3))
(CDR ' ( ( (1) )) )
NIL
Функция CONS -создает новый список из элемента и другого списка путем добавления этого элемента в голову указанного списка. Второй аргумент должен быть списком, первый — чем угодно. Результатом функции CONS является список.
(CONS 1 ' (2 3))
(1 2 3)
(CONS ' (1) ' (2 3) )
((1) 2 3)
(CONS 1 NIL)
(1)
Логические функции
NULL - возвращает значение T, если ее аргумент является пустым списком, и NIL в противном случае. Под "противным случаем" понимается, что аргумент может быть непустым списком или вообще не списком — атомом (NULL NIL)
(NULL '(1 2 3))
NIL
COND- условный оператор в Лиспе. Функция COND, в общем виде, записывается следующим образом:
( COND
((УСЛОВИЕ _1) последовательность_выражений_1) ((УСЛОВИЕ_2) последовательность_выражений_2) ((УСЛОВИЕ_n) последовательность_выражений_n) )
В ней последовательно вычисляются значения условных выражений в порядке их следования до тех пор, пока не встречается истинное выражение. Как только истинное выражение найдено, дальнейший перебор прекращается и вычисляется последовательность выражений, соответствующих этому условию. Последнее вычисленное значение возвращается в качестве значения функции COND. В том случае, если ни одно из условий не выполняется, в качестве значения функции COND возвращается NIL .
Определение собственных функций
(DEFUN имя_функции(аргументы)
(Тело_функции)
)
На Лиспе решить задачу переворачивания данного списка.
Определение: СПИСОК, ОБРАТНЫЙ ДАННОМУ, - это
сам этот список, если список пуст;
сам этот список, если список состоит из одного элемента;
в противном случае, это последний элемент данного, добавленный в качестве головы к перевернутому началу данного списка.
*Понадобятся две функции: последний элемент и начало непустого списка.
(DEFUN MY_LAST (L)
(COND
((NULL (CDR L)) (CAR L))
(Т (MY_LAST (CDR L)))
)
)
(DEFUN MY_BEGIN (L)
(COND
((NULL (CDR L)) NIL)
(T (CONS (CAR L) (MY_BEGIN (CDR L))))
)
)
(DEFUN MY_REVERS (L)
(COND
((NULL L) L)
((NULL (CDR L)) L)
(T (CONS (MY_LAST L) (MY_REVERS (MY_BEGIN L))))
)
)