Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 29.01.2017
Сообщений: 21

Найти пересечение двух множеств чисел

07.12.2017, 18:20. Показов 2147. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Надо написать программу, которой на входе будут подаваться 2 листа, а на выходе будет 1 лист, содержащий общие элементы этих двух листов.
К примеру - на входе (1 2 3 4 5) и (3 4 5 6 7)
Ответ - (3 4 5)

Я сделал код который почти работает, но все же он не видит последнего элемента первого списка. С тем же примером получается что он выдает (3 4), а не (3 4 5), потому что он каким-то образом не доходит до 5 в первом списке. Если же на вход подать (1 2 3 4 5 0) и (3 4 5 6 7), то ответ будет (3 4 5)

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
(defun foo (elem1 lst)
    (if (= elem1 (car lst))
        t
        (if (null (cdr lst))  
            nil
            (foo elem1 (cdr lst))
        )
    )
)
 
(defun bar (lst1 lst2)
    (labels
        ((iddqd (lst1 lst2 &optional (ls nil))
            (if (foo (car lst1) lst2)
                (if (null (cdr lst1))
                    (progn
                        (if (foo (car lst1) lst2)
                            (cons (car lst1) ls)
                        )
                        (list (reverse ls))
                    )
                    (iddqd (cdr lst1) lst2 (cons (car lst1) ls))
                )
                (if (null (cdr lst1))
                    (list (reverse ls))
                    (iddqd (cdr lst1) lst2 ls)
                )
            )
        ))
        (iddqd lst1 lst2)
    )
)
 
(bar '(1 2 3 9 8) '(3 2 1 9 8 8)) ;вызов
Функция foo ищет элемент в списке, выдает t если есть и nil если нету.
ide - LispWorks
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.12.2017, 18:20
Ответы с готовыми решениями:

Рекурсия. Определить предикат, проверяющий пересечение двух множеств
задание: Определить предикат, проверяющий пересечение двух множеств. Необходимо реализовать через рекурсию по значению, и отдельно...

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

Пересечение списков-множеств
Здравствуйте, помогите, пожалуйста, решить задачу. Заранее благодарна. Определите функцию, зависящую от двух аргументов u и v,...

6
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38171 / 21106 / 4307
Регистрация: 12.02.2012
Сообщений: 34,701
Записей в блоге: 14
07.12.2017, 20:12
Лучший ответ Сообщение было отмечено SharpersAreGoodGuys как решение

Решение

И все:

Lisp
1
2
3
4
5
6
7
8
9
10
(defun intersect (lst1 lst2)
  (cond ((null lst1) nil)
        ((member (car lst1) lst2) (cons (car lst1) (intersect (cdr lst1) lst2)))
        (t (intersect (cdr lst1) lst2))))
 
==> INTERSECT
 
(intersect '(1 2 3 4 5) '(3 4 5 6 7))
 
==> (3 4 5)
Добавлено через 45 секунд
Цитата Сообщение от SharpersAreGays Посмотреть сообщение
Функция foo ищет элемент в списке, выдает t если есть и nil если нету.
- для похожего действия есть стандартная функция member
2
0 / 0 / 0
Регистрация: 29.01.2017
Сообщений: 21
07.12.2017, 22:02  [ТС]
Ого, спасибо большое.
Я только учусь, можете объяснить вкратце что это и как оно работает? И как member работает?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
08.12.2017, 00:37
А свой код не хотите до ума довести? Толку больше будет в смысле обучения.

Начните с алгоритма. Словами его напишите, если надо. Например, в строках 14 и 17 одно и то же проверяется — в этом есть глубокий смысл? В строке 16 вы пишете progn, в результате в ветке «да» вычисляются две формы, и результат вычисления первой теряется. Зачем нужна первая форма (и progn), раз вы выбрасываете результат? Почему вы всё время возвращаете (list (reverse ls)), а не просто (reverse ls)?

В foo у вас тоже глюк: она не работает, если lst — пустой список. Кроме того, = сравнивает только числа, а для произвольных объетов обычно используют eql.

И лучше следуйте общепринятым правилам оформления кода. Главное — не пишите скобок на отдельных строчках. Обычный отступ — 2 пробела. Не экономьте букву в именах переменных, пишите полностью: list, list1.
1
0 / 0 / 0
Регистрация: 29.01.2017
Сообщений: 21
08.12.2017, 09:56  [ТС]
Цитата Сообщение от helter Посмотреть сообщение
Начните с алгоритма. Словами его напишите, если надо. Например, в строках 14 и 17 одно и то же проверяется — в этом есть глубокий смысл?
Цитата Сообщение от helter Посмотреть сообщение
Зачем нужна первая форма (и progn), раз вы выбрасываете результат? Почему вы всё время возвращаете (list (reverse ls)), а не просто (reverse ls)?
Программирую как могу

Цитата Сообщение от helter Посмотреть сообщение
В строке 16 вы пишете progn, в результате в ветке «да» вычисляются две формы, и результат вычисления первой теряется.
Наконец-то понял и исправил. Убрал строки 16, 20, 21. Только как теперь вернуть развернутый список?

Цитата Сообщение от helter Посмотреть сообщение
В foo у вас тоже глюк: она не работает, если lst — пустой список. Кроме того, = сравнивает только числа, а для произвольных объетов обычно используют eql.
И не надо

Цитата Сообщение от helter Посмотреть сообщение
И лучше следуйте общепринятым правилам оформления кода. Главное — не пишите скобок на отдельных строчках. Обычный отступ — 2 пробела.
Оформляю как умею. Уж не знаю как ентот ваш лисп оформляют
0
 Аватар для _sg
4708 / 4403 / 380
Регистрация: 12.05.2012
Сообщений: 3,101
08.12.2017, 10:57
как вариант:
Lisp
1
2
3
4
5
6
7
(defun _intersection (w v &optional acc &aux (a (car w)))
  (cond ((null w) (nreverse acc))
        ((member a v) (_intersection (cdr w) v (cons a acc )))
        ((_intersection (cdr w) v acc))))
 
> (_intersection '(a s d f g h ) '(q a w s e d r))
(A S D)
Добавлено через 19 секунд
Lisp
1
2
3
4
5
6
7
(defun _intersection (w v)
  (cond ((null w) nil)
        ((member (car w) v) (cons (car w) (_intersection (cdr w) v)))
        ((_intersection (cdr w) v))))
 
> (_intersection '(a s d f g h ) '(q a w s e d r))
(A S D)
Добавлено через 12 секунд
Lisp
1
2
3
4
5
6
7
(defun _intersection (w v &aux (a (car w)))
  (when w (if (member a v)
              (cons a (_intersection (cdr w) v))
              (_intersection (cdr w) v))))
 
> (_intersection '(a s d f g h ) '(q a w s e d r))
(A S D)
Добавлено через 16 секунд
Lisp
1
2
3
4
5
(defun _intersection (w v) 
  (loop for a in w when (member a v) collect a))
 
> (_intersection '(a s d f g h ) '(q a w s e d r))
(A S D)
Добавлено через 15 секунд
Lisp
1
2
3
4
5
(defun _intersection (w v)
  (remove-if-not #'(lambda (a) (member a v)) w)) 
 
> (_intersection '(a s d f g h ) '(q a w s e d r))
(A S D)
Добавлено через 3 минуты
Lisp
1
2
3
4
(defun _intersection (w v) (intersection w v))
 
> (_intersection '(a s d f g h ) '(q a w s e d r))
(A S D)
Добавлено через 2 минуты
Цитата Сообщение от SharpersAreGays Посмотреть сообщение
не знаю как ентот ваш лисп оформляют
Google Common Lisp Style Guide

Добавлено через 1 минуту
Tutorial on Good Lisp Programming Style

Добавлено через 35 минут
Рекурсия. Определить предикат, проверяющий пересечение двух множеств

Добавлено через 3 минуты
Пересечение множеств/ Intersection of sets
1
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
08.12.2017, 15:31
Цитата Сообщение от SharpersAreGays Посмотреть сообщение
Программирую как могу
В смысле? Рандомно накидать скобок и надеяться, что заработает? Алгоритм-то какой?

Цитата Сообщение от SharpersAreGays Посмотреть сообщение
Только как теперь вернуть развернутый список?
reverse разворачивает список. (reverse list) — список list в обратном порядке.

Цитата Сообщение от SharpersAreGays Посмотреть сообщение
Оформляю как умею. Уж не знаю как ентот ваш лисп оформляют
Цитата Сообщение от helter Посмотреть сообщение
Главное — не пишите скобок на отдельных строчках. Обычный отступ — 2 пробела. Не экономьте букву в именах переменных, пишите полностью: list, list1.
Подробнее:
http://dept-info.labri.fr/~str... ation.html

Обычно люди пользуются иде, которая следит за отступами сама.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.12.2017, 15:31
Помогаю со студенческими работами здесь

Пересечение, разность множеств
не подскажите как реализовать пересечение и разность? например, пересечение : '(a s d (h)) '(h a y)) -> (a h); разность : '(a e r...

Пересечение множеств/ Intersection of sets
Привет всем, я в Лиспе новичок, есть задание, может кто-нибудь поможет, пожалуйста. Было бы здорово, если решите в DrScheme Privet...

Найти пересечение двух множеств и вывести данное пересечение и кол-во элементов в нем
Здравствуйте, помогите, пожалуйста, дорешать задачу. Условие: найти пересечение двух множеств и вывести данное пересечение и кол-во...

[SimComp] Найти пересечение двух множеств чисел, представленных двумя введёнными массивами (нужны комментарии)
*Найти пересечение двух множеств чисел, пердставленных двумя введёнными массивами start in sty n1 zero sta i loop1 lda i ...

Найти пересечение двух множеств
В C# найти пересечение множеств, которые вводятся рендомно, и из этого пересечения вывести на экран только четные! Желательно в форме...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru