Задание на использование рекурсии - 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
, что означает, что списки равны.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д