Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
SevLenin
1 / 1 / 0
Регистрация: 29.04.2014
Сообщений: 55
#1

Удаление элементов-списков

24.07.2016, 18:33. Просмотров 396. Ответов 8

А вот такой примерчик ещё у меня:
Даны списки lst1 и lst2. Реализовать итерационную (без рекурсии) функцию, которая удаляет из lst1 все элементы-списки, которые соответствуют тому же множеству, что и lst2. Пример : для списков : lst1=’(1 (2 2 3) 4 (3 2 3) 5), lst2=’(2 2 3) результатом будет ’(1 4 (3 2 3) 5).

Пример с рекурсией я нашёл, т.е.:

Lisp
1
2
3
4
(defun rm (w v)
  (cond ((null w) nil)
        ((equal (car w) v) (rm (cdr w) v))
        ((cons (car w) (rm (cdr w) v)))))
рез-т:
(rm '(1 (2 2 3) 4 (3 2 3) 5) '(2 2 3))

(1 4 (3 2 3) 5)

С этим я разобрался, а вот как такую ф-цию сделать итерационным способом не получилось, пишет постоянные ошибки... вот что я навоял:
Lisp
1
2
3
4
5
6
7
8
9
10
  (defun rm2 (w v)
  (
    (setf l () )
    (loop     
       for e in w
         ((cond (null e) (print(l))))
         ((equal e v)  (setf  w (cdr w)))
         (T (cons e 'l))
    )     
  )
Добавлено через 3 минуты
что я не так написал?

Добавлено через 1 час 1 минуту
Вот теперь ошибок поменьше выдаёт система, но всё равно что то не так, не работает.. (

Lisp
1
2
3
4
5
6
7
8
9
(defun rm2 (w v)
  ((setf l ()) ; 
    (loop       
        for e in w do
        ((cond (null e) (print(l))))
        ((equal e v)  (setf  w (cdr w)))
        (T (setf l (cons e l)))
    )
)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2016, 18:33
Ответы с готовыми решениями:

Выделение списков на заданном уровне и удаление заданного их количества
Написать программу выделения списков на заданном уровне и удаления заданного их...

Повторные вхождения элементов списков
Доброго всем времени суток) Дана такая задача: "Исключить все повторные...

Чередование элементов двух списков
Homelisp. Написать функцию, которая, чередуя элементы двух списков, строит...

Вычисление сумм элементов списков
Заданы списки чисел X, Y. Вычислить Z=(\sum {x}_{i}-\sum {y}_{i})/3.14, где...

Перестановка списков заданных уровней, учитывая промежуточное состояние списков
Написать программу перестановки списков заданных уровней, учитывая...

8
_sg
3719 / 3516 / 237
Регистрация: 12.05.2012
Сообщений: 2,447
24.07.2016, 19:54 #2
как вариант:
Lisp
1
2
3
4
5
(defun rm (w v)
  (loop for a in w unless (equal a v) collect a))
 
> (rm '(1 (2 2 3) 4 (3 2 3) 5) '(2 2 3)) 
(1 4 (3 2 3) 5)
1
SevLenin
1 / 1 / 0
Регистрация: 29.04.2014
Сообщений: 55
24.07.2016, 22:07  [ТС] #3
Уважаемый _SG, я Ваш пример увидел ещё и на другом сайте, а могли бы Вы переделать вот этот пример с немного другим условием:

Даны списки lst1 и lst2. Реализовать функцию, которая удаляет из lst1
все элементы-списки, которые соответствуют тому же множеству, что и
lst2. Пример : для списков : lst1=’(1 (2 2 3) 4 (3 2 3) 5), lst2=’(3 2 3 2) результатом будет — ’(1 4 5).

Lisp
1
2
3
4
5
(defun dump-sub (w v)
  (when w (let ((a (car w)) (d (cdr w)))
            (if (or (atom a) (nset-difference a v))
                (cons a (dump-sub d v))
                (dump-sub d v)))))
(dump-sub '((2 3 2 3) 8 (2 3) (2 7) (2) (2 2 3) 5 ) '(3 2 3 2))
(8 (2 7) 5)

Получается, это более точный (Ваш) пример для меня...(Только это с помощью рекурсии). Но мне нужно именно с помощью итерационных циклов...
0
_sg
3719 / 3516 / 237
Регистрация: 12.05.2012
Сообщений: 2,447
24.07.2016, 22:17 #4
Lisp
1
2
3
4
5
6
7
(defun dump-sub (w v)
  (loop for a in w
        when (or (atom a) (nset-difference a v))
        collect a))
 
> (dump-sub '((2 3 2 3) 8 (2 3) (2 7) (2) (2 2 3) 5 ) '(3 2 3 2))
(8 (2 7) 5)
1
SevLenin
1 / 1 / 0
Регистрация: 29.04.2014
Сообщений: 55
24.07.2016, 22:19  [ТС] #5
Спасибо всем!!! Вы и форум бесценны...
0
_sg
3719 / 3516 / 237
Регистрация: 12.05.2012
Сообщений: 2,447
24.07.2016, 23:39 #6
как вариант:
Lisp
1
2
3
4
5
6
7
(defun dump-sub (w v)
  (remove-if-not
   #'(lambda (a) (or (atom a) (nset-difference a v)))
   w))
 
> (dump-sub '((2 3 2 3) 8 (2 3) (2 7) (2) (2 2 3) 5 ) '(3 2 3 2))
(8 (2 7) 5)
2
Catstail
Модератор
23569 / 11672 / 2041
Регистрация: 12.02.2012
Сообщений: 19,044
25.07.2016, 16:14 #7
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(defun task (lst1 lst2)
  (let ((r nil))
    (iter (for a in lst1) (unless (equal a lst2) (collecting a into r)) r)))
 
 
==> task
 
(task '(1 (2 2 3) 4 (3 2 3) 5) '(2 2 3)) 
 
==> (1 4 (3 2 3) 5)
 
(defun task (lst1 lst2)
  (let ((r nil))
    (dolist (a lst1 (reverse r))
      (unless (equal a lst2) (push a r)))))
 
==> task
 
(task '(1 (2 2 3) 4 (3 2 3) 5) '(2 2 3)) 
 
==> (1 4 (3 2 3) 5)
3
route66
492 / 425 / 56
Регистрация: 29.04.2011
Сообщений: 443
02.09.2016, 12:19 #8
Java
1
2
3
4
5
6
def remove[A,B](lst1: List[A], lst2: List[B]): List[A] = {
  lst1 filter {
    case x: List[_] => x != lst2
    case _ => true
  }
}
Код
scala> remove(
  List(1, List(2,2,3), 4, List(3,2,3), 5),
  List(2,2,3)
)
res0: List[Any] = List(1, 4, List(3,2,3), 5)
3
_sg
3719 / 3516 / 237
Регистрация: 12.05.2012
Сообщений: 2,447
02.10.2016, 11:49 #9
Lisp
1
2
3
4
5
6
7
(defun drop-set (w v)
  (when w (if (or (atom (car w)) (set-difference (car w) v))
              (cons (car w) (drop-set (cdr w) v))
              (drop-set (cdr w) v))))
 
> (drop-set '((2 3 2 3) 8 (2 3) (2 7) (2) (2 2 3) 5) '(3 2 3 2))
(8 (2 7) 5)
Добавлено через 14 секунд
Lisp
1
2
3
4
5
6
7
8
9
(defun drop-set (w v)
  (when w ((lambda (a d)
             (if (or (atom a) (set-difference a v))
                 (cons a (drop-set d v))
                 (drop-set d v)))
           (car w) (cdr w))))
 
> (drop-set '((2 3 2 3) 8 (2 3) (2 7) (2) (2 2 3) 5) '(3 2 3 2))
(8 (2 7) 5)
Добавлено через 15 секунд
Lisp
1
2
3
4
5
6
7
8
(defun drop-sub (w v) 
  (remove-if #'(lambda (s)
                 (when (listp s)
                   (subsetp s v)))
             w))
 
> (drop-set '((2 3 2 3) 8 (2 3) (2 7) (2) (2 2 3) 5) '(3 2 3 2))
(8 (2 7) 5)
Добавлено через 16 секунд
Lisp
1
2
3
4
5
6
7
(defun drop-set (w v) 
  (delete-if #'(lambda (s)
                 (and (listp s) (subsetp s v)))
             w))
 
> (drop-set '((2 3 2 3) 8 (2 3) (2 7) (2) (2 2 3) 5) '(3 2 3 2))
(8 (2 7) 5)
Добавлено через 32 секунды
Lisp
1
2
3
4
5
6
7
8
(defun drop-set (w v)
  (when w (let ((a (car w)) (d (cdr w)))
            (if (or (atom a) (nset-difference a v))
                (cons a (drop-set d v))
                (drop-set d v)))))
 
> (drop-set '((2 3 2 3) 8 (2 3) (2 7) (2) (2 2 3) 5) '(3 2 3 2))
(8 (2 7) 5)
2
02.10.2016, 11:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.10.2016, 11:49

Список из разных элементов двух списков
Здраствуйте очень нужна помощь в написании простой програмы : создать новый...

Вычислить сумму произведения элементов двух списков
вычислить сумму произведения элементов двух списков.

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru