Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 138
1

Понять принцип работы функции, находящую теоретико-множественную разность двух списков

21.12.2021, 17:48. Показов 988. Ответов 3

Author24 — интернет-сервис помощи студентам
Доброго времени суток, господа.
Предо мной поставлена такая задача: Разработать функцию, находящую теоретико-множественную разность двух списков.
Код, который бы решал эту задачу я нашёл, но хотелось бы разобраться в сути решения, как работает этот код всё понять не могу даже с трассировкой.

Lisp
1
2
3
4
(defun difference (w v)
  (cond ((null w) w)
        ((member (car w) v) (difference (cdr w) v))
        ((cons (car w) (difference (cdr w) v)))))
Для проверки кода
Lisp
1
(difference '(1 2 3 4 5) '(4 5 6))
Всё что я смог отрыть - это лишь пояснения по каждой функции, но как что и в какой последовательности вызывается, а главное что получается я не могу понять.

Мои мысли:
1. Объявляется функция difference с двумя параметрами w и v
2. Объявляются 3 условия для оператора cond из них
2.1. ((null w) w) - я так понял тут проверяется каждый элемент списка w на null, если нет null-ов, то возвращается nil
2.2. ((member (car w) v) (difference (cdr w) v)) - Функция member проверяет, находится ли первый аргумент внутри списка , представленного вторым аргументом, то есть member проверяет находится ли первый элемент (голова списка) w (1) в списке v (4 5 6) и после функция вызывает саму себя с аргументами, равными конечному элементу списка w (5) и v (456) и после я теряю связь с реальностью, т.к не могу такую вложенность уместить у меня в голове ☺
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.12.2021, 17:48
Ответы с готовыми решениями:

Определите предикат p(+U, +V, ?L) вычисляющий теоретико-множественную разность U\V
Здравствуйте, помогите пожалуйста решить эту задачу Определите предикат p(+U, +V, ?L)...

Список: Используя предикат принадлежности элемента списку, разработать функцию, находящую объединение двух списков.
Используя предикат принадлежности элемента списку разработать функцию находящую...

Найти теоретико-множественную разницу С = А \ В
Для двух целочисленных одномерных массивов А и В найти их теоретико-множественную разницу С = А \ В.

Найти вектор C, что представляет собой теоретико-множественную разницу эл-в вектора A и эл-в вектора B (А и В =11)
Даны векторы действительных чисел A и B размером 11. Используя операторы цикла и условный оператор,...

Написать функцию, находящую максимум из трех своих аргументов используя функцию максимума из двух
Дорогие програмисты прошу помощи.и Сильно не критикуйте. необходимо: Написать функцию, находящую...

3
Модератор
Эксперт функциональных языков программированияЭксперт Python
36609 / 20336 / 4222
Регистрация: 12.02.2012
Сообщений: 33,660
Записей в блоге: 13
21.12.2021, 22:09 2
Лучший ответ Сообщение было отмечено _sg как решение

Решение

Цитата Сообщение от LSTSnaiper Посмотреть сообщение
((null w) w) - я так понял тут проверяется каждый элемент списка w на null, если нет null-ов, то возвращается nil
- нет. Проверяется весь список w - не пуст ли он. Если пуст, то пусто и пересечение. Автор кода немного "выпендрился". Понятнее было бы так:

Lisp
1
2
3
 ...
(cond ((null w) nil)
 ...

Lisp
1
((member (car w) v) (difference (cdr w) v))
Если голова w входит в v, то ее нужно отбросить. т.е. разность списков w=(1 2 3) и v=(6 7 1) не должна содержать 1, верно?

Lisp
1
((cons (car w) (difference (cdr w) v)))))
А иначе голову (которая не входит во второй список) нужно сохранить.
2
4699 / 4394 / 380
Регистрация: 12.05.2012
Сообщений: 3,096
22.12.2021, 09:02 3
как вариант:
Lisp
1
2
3
4
5
6
7
8
9
(defun -set-difference
    (w v &aux (a (car w)) (d ( cdr w)))
  (when w (if (member a v) (-set-difference d v)
              (cons a (-set-difference d v)))))
 
> (-set-difference '(1 2 3 4 5) '(4 5 6))
(1 2 3)
> (set-difference '(1 2 3 4 5) '(4 5 6))
(1 2 3)
1
1 / 1 / 1
Регистрация: 18.03.2018
Сообщений: 138
22.12.2021, 09:08  [ТС] 4
Понял, спасибо большое вам за объяснение!
0
22.12.2021, 09:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.12.2021, 09:08
Помогаю со студенческими работами здесь

Определите предикат p(+U, +V, ?L) вычисляющий симметрическую разность двух списков
Здравствуйте, помогите пожалуйста решить эту задачу Определите предикат p(+U, +V, ?L) -истинный...

Разработать функцию, находящую сумму элементов с нечетными номерами
Разработать функцию, находящую сумму элементов с нечетными номерами в заданном списке чисел ...

Разработать функцию, находящую сумму элементов с нечетными номерами в заданном списке чисел
Разработать функцию, находящую сумму элементов с нечетными номерами в заданном списке чисел ...

Описать функцию находящую среднее арифметическое двух чисел
Опишите функцию FSR, находящую среднее арифметическое двух чисел. Для любых чисел a и b , введённых...

Определить функцию, находящую максимум из двух различных чисел.
Даны 6 различных чисел. найти максимальное из них, определить функцию, находящую максимум из двух...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru