Como escrever uma função esquema que leva duas listas e retorna quatro listas

StackOverflow https://stackoverflow.com/questions/765484

  •  12-09-2019
  •  | 
  •  

Pergunta

Eu tenho 2 listas de elementos '(a b c) (d b f) e quer encontrar diferenças, união e intersecção em um resultado. Isso é possível? Como?

Eu escrevi uma função membro que verifica se há um carro da primeira lista na segunda lista, mas não posso jogar um membro para a nova lista.

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

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

O meu resultado deve ser (( a c) (d f) (a b c d f) (b)).

Foi útil?

Solução

Como já foi dito, tudo o que você precisa fazer é criar funções separadas para calcular a interseção, união e subtração dos dois conjuntos, e chamá-los a partir checkResult:

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

Aqui estão alguns exemplo de união, interseção, e funções de subtração:

(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)))))

Nota: uma vez que estes são conjuntos e ordem não importa, os resultados não são ordenados. Além disso, as funções assumem que as entradas são conjuntos, e, portanto, não fazer qualquer verificação duplicada para além do que é exigido para a união.

Outras dicas

Claro que é possível. Supondo que você tenha função para calcular as diferenças, interseção união etc:

 (define (checkResult lis1 list2)
   (list (difference lis1 lis2)
        (union ...

Claro que é possível. Aqui estão algumas dicas:

  1. o que é o resultado da combinação de uma lista e uma lista vazia?
  2. Você não tem que fazer tudo de uma vez. Pegue um pedaço de cada vez.
de

No topo do Charlie Martin e tomjen respostas, eu vim com essa fonte:

União Interseção e Diferença

A implementação das funções distintas podem ser encontrados com explicações agradáveis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top