Задача на использование рекурсии - Lisp (229242)
Формулировка задачи:
Описать функцию с использованием рекурсии. Даны списки
list1
иlist2
. Реализовать функцию, которая удаляет изlist1
все элементы-списки, которые соответствуют тому же множеству, что иlist2
. Например: для списков:list1
='(1(2 2 3) 4 (3 2 3) 5),list2
='(3 2 3 2) результатом будет '(1 4 5).Решение задачи: «Задача на использование рекурсии»
textual
Листинг программы
(defun is-equal (lst1 lst2) (if (atom lst1) nil (and (not (remove-if (lambda (x) (member x lst2)) lst1)) (not (remove-if (lambda (x) (member x lst1)) lst2))))) (defun task (lst1 lst2) (cond ((null lst1) nil) ((is-equal (car lst1) lst2) (task (cdr lst1) lst2)) (t (cons (car lst1) (task (cdr lst1) lst2))))) ==> TASK (task '(1 (2 2 3) 4 (3 2 3) 5) '(2 3 3 2)) ==> (1 4 5)
Объяснение кода листинга программы
В коде представлена реализация функции task, которая выполняет следующие действия:
taskпринимает два аргумента:lst1иlst2.- Если
lst1— этоnil, то функция возвращаетnil. - Если
is-equalвозвращаетnil, то функция вызывает себя рекурсивно дляcdrlst1иlst2. - Если
is-equalвозвращает неnil, то функция возвращаетconsс первым элементомlst1и вызовом функцииtaskдляcdrlst1иlst2. Функцияis-equalпроверяет, являются ли два списка равными. Она принимает два аргумента:lst1иlst2. Еслиlst1является атомом, то функция возвращаетnil. В противном случае она проверяет, содержатся ли все элементыlst1вlst2и наоборот. Если это так, то функция возвращаетnil, иначе возвращаетt. В данном примере функцияtaskвызывается с двумя списками:lst1—(1 (2 2 3) 4 (3 2 3) 5)иlst2—(2 3 3 2). Функцияis-equalвызывается для проверки равенства двух списков. Первый вызов функцииis-equalпроверяет, является ли первый элементlst1равнымlst2. Второй вызов функцииis-equalпроверяет, являются ли два оставшихся элементаlst1равнымиlst2. Поскольку оба вызова функцииis-equalвозвращаютnil, функцияtaskвозвращаетconsс первым элементомlst1и вызовом функцииtaskдля оставшихся элементовlst1иlst2. В результате выполнения функцииtaskбудет возвращен список(1 4 5).