Как написать функцию схемы, которая принимает два списка и возвращает четыре списка - PullRequest
3 голосов
/ 19 апреля 2009

У меня есть 2 списка элементов '(a b c)' (d b f), и я хочу найти различия, объединение и пересечение в одном результате. Это возможно? Как?

Я написал функцию-член, которая проверяет, есть ли автомобиль из первого списка во втором списке, но я не могу выбросить члена в новый список.

(define (checkResult lis1 lis2)
  (cond...........

))
(checkresult '( a b c) '(d b f))

Мой результат должен быть (( a c) (d f) (a b c d f) (b)).

Ответы [ 4 ]

10 голосов
/ 19 апреля 2009

Как уже говорили другие, все, что вам нужно сделать, это создать отдельные функции для вычисления пересечения, объединения и вычитания двух множеств и вызова их из checkresult:

(define (checkresult a b)
  (list (subtract a b)
        (subtract b a)
        (union a b)
        (intersect a b)))

Вот несколько примеров функций объединения, пересечения и вычитания:

(define (element? x lst)
  (cond ((null? lst) #f)
        ((eq? x (car lst)) #t)
        (#t (element? x (cdr lst)))))

(define (union a b)
  (cond ((null? b) a)
        ((element? (car b) a)
         (union a (cdr b)))
        (#t (union (cons (car b) a) (cdr b)))))

(define (intersect a b)
  (if (null? a) '()
      (let ((included (element? (car a) b)))
        (if (null? (cdr a))
            (if included a '())
            (if included
                (cons (car a) (intersect (cdr a) b))
                (intersect (cdr a) b))))))

(define (subtract a b)
  (cond ((null? a) '())
        ((element? (car a) b)
         (subtract (cdr a) b))
        (#t (cons (car a) (subtract (cdr a) b)))))

Примечание: поскольку это наборы и порядок не имеет значения, результаты не сортируются. Кроме того, функции предполагают, что входные данные являются наборами, и, следовательно, не выполняют никакой повторной проверки, кроме той, которая требуется для объединения.

3 голосов
/ 19 апреля 2009

Конечно, это возможно. Предполагая, что у вас есть функция для вычисления различий, пересечения объединений и т. Д .:

 (define (checkResult lis1 list2)
   (list (difference lis1 lis2)
        (union ...
2 голосов
/ 19 апреля 2009

Конечно, это возможно. Вот пара подсказок:

  1. каков результат объединения списка и пустого списка?
  2. Вам не нужно делать все это сразу. Возьми кусочек за раз.
1 голос
/ 19 апреля 2009

Помимо ответов Чарли Мартина и Томьена, я нашел этот источник:

Пересечение и различие Юнион

Реализация различных функций может быть найдена с хорошими объяснениями.

...