Задание на использование рекурсии - Lisp
Формулировка задачи:
Напишите функцию, возвращающую Т, если одинаковые атомы расположены в списках x и y в одном и том же порядке, учитывая все атомы всех подсписков обоих списков. Например, результатом применения функции к аргументам
’(a 3 (4 b 7 c (4 d)) e) и ’((a 1 b) 9 (c d)) (e 8)) должен быть ’t.
Решение задачи: «Задание на использование рекурсии»
textual
Листинг программы
(defun flat (lst) (cond ((null lst) nil) ((atom (car lst)) (cons (car lst) (flat (cdr lst)))) (t (append (flat (car lst)) (flat (cdr lst)))))) ==> FLAT (defun diff (lst1 lst2) (cond ((null lst1) nil) ((member (car lst1) lst2) (cons (car lst1) (diff (cdr lst1) lst2))) (t (diff (cdr lst1) lst2)))) ==> DIFF (defun task (lst1 lst2) (let ((s1 (flat lst1)) (s2 (flat lst2))) (equal (diff s1 s2) (diff s2 s1)))) ==> TASK (task '(a 3 (4 b 7 c (4 d)) e) '((a 1 b) 9 (c d) (e 8))) ==> T (task '(a 3 (4 b 7 c (4 d)) e) '((a 1 b) 9 (c e) (d 8))) ==> NIL
Объяснение кода листинга программы
В коде дано три функции: flat
, diff
и task
. Функция flat
использует рекурсию для преобразования списка в одноплоскость. Функция diff
использует рекурсию для нахождения разности между двумя списками. Функция task
использует рекурсию для сравнения двух списков на равенство.
Вот список элементов кода, оформленных в виде описания:
flat
:- Аргументы: lst
- Описание: функция использует рекурсию для преобразования списка в одноплоскость
- Рекурсивные вызовы: (car lst), (cdr lst)
- Базовый случай: (null lst)
- Шаблонный случай: (atom (car lst))
- Повторяющийся случай: (t (append (flat (car lst)) (flat (cdr lst))))
diff
:- Аргументы: lst1 lst2
- Описание: функция использует рекурсию для нахождения разности между двумя списками
- Рекурсивные вызовы: (member (car lst1) lst2), (diff (cdr lst1) lst2)
- Базовый случай: (null lst1)
- Шаблонный случай: (member (car lst1) lst2)
- Повторяющийся случай: (t (diff (cdr lst1) lst2))
task
:- Аргументы: lst1 lst2
- Описание: функция использует рекурсию для сравнения двух списков на равенство
- Рекурсивные вызовы: (diff s1 s2), (diff s2 s1)
- Базовый случай: (null lst1)
- Шаблонный случай: (member (car lst1) lst2)
- Повторяющийся случай: (t (diff (cdr lst1) lst2))
Пример использования функций:
(task '(a 3 (4 b 7 c (4 d)) e) '((a 1 b) 9 (c e) (d 8))) -> NIL
В этом примере функция
task
вызывает функциюflat
для преобразования списков в одноплоскость, затем функциюdiff
для нахождения разности между двумя списками и, наконец, сравнивает результаты с помощью функцииequal
. Результатом являетсяNIL
, что означает, что списки равны.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д