Задача на использование рекурсии - Lisp (229324)
Формулировка задачи:
Вот само задание: напишите функцию, возвращающую Т, если одинаковые атомы расположены в списках х и у в одном и том же порядке
Буду очень благодарна любой помощи - особенно, полному коду для решения!
Решение задачи: «Задача на использование рекурсии»
textual
Листинг программы
(defun del-all (lsta lst) (cond ((null lst) nil) ((member (car lst) lsta) (cons (car lst) (del-all lsta (cdr lst)))) (t (del-all lsta (cdr lst))))) (defun task (a1 a2 lst1 lst2) (let ((s1 (del-all (list a1 a2) lst1)) (s2 (del-all (list a1 a2) lst2))) (equal s1 s2))) (task 'a 'x '(a b x c) '(h a x d)) ==> T (task 'a 'x '(a b x c) '(h x d a)) ==> NIL
Объяснение кода листинга программы
В коде определены две функции: del-all
и task
.
del-all
- принимает три аргумента:lsta
,lst
иx
. Еслиlst
равноnil
, то возвращаетnil
. Если первый элементlst
является членом спискаlsta
, то возвращает новый список, в котором первый элемент - этоcar
изlst
, а остальные элементы - результат вызоваdel-all
дляlsta
иcdr
изlst
. В противном случае, еслиlst
не является пустым списком, то рекурсивно вызываетdel-all
дляlsta
иcdr
изlst
.task
- принимает три аргумента:a1
,a2
и два спискаlst1
иlst2
. Используетlet
для создания двух переменных:s1
иs2
. Значениеs1
- это результат вызоваdel-all
для списка, содержащегоa1
иa2
, и исходного спискаlst1
. Значениеs2
- это результат вызоваdel-all
для списка, содержащегоa1
иa2
, и исходного спискаlst2
. Затем используетequal
для сравнения значенийs1
иs2
. Если они равны, то возвращаетt
, иначе возвращаетnil
. При вызовеtask 'a 'x '(a b x c) '(h a x d)
возвращаетt
, потому что спискиs1
иs2
равны. При вызовеtask 'a 'x '(a b x c) '(h x d a)
возвращаетnil
, потому что спискиs1
иs2
не равны.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д