Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258
1

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

24.11.2014, 17:50. Показов 1250. Ответов 8
Метки нет (Все метки)

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

Lisp
1
2
3
4
5
6
(defun poisk (u v)
  (cond
    ((null v) u)
    ((listp v)
     (poisk (if (member (first v) u) (delete (first v) u) (append u `(,(first v))))
     (rest v)))))
Заранее всем спасибо.
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2014, 17:50
Ответы с готовыми решениями:

Определите функцию, зависящую от одного аргумента, которая по данному списку формирует список его элементов
Задача: Определите функцию, зависящую от одного аргумента, которая по данному списку формирует...

Напишите функцию (f N ), которая выдает список всех последовательностей (списков)
Помогите решить задачу на Home Lisp.Напишите функцию (f N ), которая выдает список всех...

Определить функцию, зависящую от x и y, которая выводит сообщение: «Принадлежит», когда точка с координатами
Определить функцию, зависящую от x и y, которая выводит сообщение: «При-надлежит», когда точка с...

Определить функцию которая вычисляет сумму элементов
Помогите, друзья! дано 2 списка чисел y1 и y2 произвольной длины. Определить функцию которая...

8
4506 / 4214 / 356
Регистрация: 12.05.2012
Сообщений: 2,965
24.11.2014, 19:12 2
Лучший ответ Сообщение было отмечено Jin200611 как решение

Решение

Lisp
1
2
3
4
5
6
7
8
9
10
(defun our-set-exclusive-or (w v)
  (nconc (unique w v) (unique v w)))
 
(defun unique (w v)
  (cond ((null w) nil)
        ((member (car w) v) (unique (cdr w) v))
        ((cons (car w) (unique (cdr w) v)))))
 
> (our-set-exclusive-or '(a b) '(b c))
(A C)
Lisp
1
2
3
4
5
6
7
8
9
10
(defun our-set-exclusive-or (w v)
  (nconc (unique w v) (unique v w)))
 
(defun unique (w v)
  (when w (if (member (car w) v)
              (unique (cdr w) v)
              (cons (car w) (unique (cdr w) v)))))
 
> (our-set-exclusive-or '(a b) '(b c))
(A C)
Добавлено через 3 минуты
Lisp
1
2
3
4
5
6
7
8
9
10
(defun our-set-exclusive-or (w v)
  (nconc (unique w v) (unique v w)))
 
(defun unique (w v &aux (a (car w)) (d (cdr w)))
  (when w (if (member a v)
              (unique d v)
              (cons a (unique d v)))))
 
> (our-set-exclusive-or '(a b) '(b c))
(A C)
2
14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258
24.11.2014, 19:18  [ТС] 3
_sg Огромное спасибо, все работает классно.

Добавлено через 1 минуту
Я тут немного запутался в алгоритме задачи, можете в двух словах пояснить.
0
4506 / 4214 / 356
Регистрация: 12.05.2012
Сообщений: 2,965
24.11.2014, 19:30 4
nconc объединяет список элементов, которые входят в первый список и не входят во второй, со списком элементов, которые входят во второй список и не входят в первый.
2
14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258
24.11.2014, 19:40  [ТС] 5
Спасибо за пояснение.
1
Модератор
Эксперт Python
28579 / 15445 / 3051
Регистрация: 12.02.2012
Сообщений: 25,304
Записей в блоге: 4
24.11.2014, 20:29 6
Без рекурсии:

Lisp
1
2
3
4
5
6
7
8
9
(defun sym-diff (u v)
  (append (remove-if #'(lambda (x) (member x v)) u)
          (remove-if #'(lambda (x) (member x u)) v)))
 
==> sym-diff
 
(sym-diff '(1 2 3 4) '(3 4 5 6))
 
==> (1 2 5 6)
Рекурсивно в одно действие:

Lisp
1
2
3
4
5
6
7
8
9
10
(defun sym-diff (u v &optional (r nil))
  (cond ((null u) (append v r))
        ((member (car u) v) (sym-diff (cdr u) (remove (car u) v) r))
        (t (sym-diff (cdr u) v (cons (car u) r)))))
 
==> sym-diff
 
(sym-diff '(1 2 3 4) '(3 4 5 6))
 
==> (5 6 2 1)
2
14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258
24.11.2014, 21:21  [ТС] 7
Спасибо, сижу разбираюсь.
1
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,354
25.11.2014, 01:05 8
Цитата Сообщение от Jin200611 Посмотреть сообщение
Здравствуйте всем. Задали задание, выполнил, все работает нормально, но нужно с использованием рекурсии, помогите доделать.
Вы сделали все почти правильно. Немного запутались в синтаксисе. Ваш "допиленный" пример:
Lisp
1
2
3
4
5
6
7
8
(defun xor-set (x y)
  (if (null y)
      x
      (xor-set 
       (if (member (first y) x)
           (remove (first y) x)
           (append x `(,(first y))))
       (rest y))))
1
14 / 14 / 1
Регистрация: 09.01.2012
Сообщений: 258
25.11.2014, 05:27  [ТС] 9
Спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2014, 05:27

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

Написать функцию, которая вычисляет количество всех атомов в списке(кроме NIL) с учетом всех подсписков всех уровней вложенности
Написать функцию, которая вычисляет количество всех атомов в списке(кроме NIL) с учетом всех...

Определить функцию (f a n), которая от 2-х числ.аргументов вычисляет a+a*(a+1)+a*(a+1)*(a+2)+.+a*(a+1)*.*(a+n)
Здравствуйте. Задали задание: Определите функцию (f a n), которая от двух числовых аргументов...

Запишите, пожалуйста, функцию, которая позволяет объединить главы трех списков в один список:
Запишите, пожалуйста, функцию, которая позволяет объединить главы трех списков в один список: (T Y...


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

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

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