Come scrivere una funzione schema che prende due liste e restituisce quattro liste

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

  •  12-09-2019
  •  | 
  •  

Domanda

Ho 2 elenchi di elementi '(a b c)' (D B f) e voglio trovare le differenze, l'unione e intersezione in un unico risultato. È possibile? Come?

ho scritto una funzione membro che controlla se c'è una macchina del primo elenco nella seconda lista, ma non riesco a buttare un membro per la nuova lista.

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

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

Il mio risultato dovrebbe essere (( a c) (d f) (a b c d f) (b)).

È stato utile?

Soluzione

Come altri hanno detto, tutto quello che dovete fare è di creare funzioni separate per calcolare l'intersezione, unione, e la sottrazione dei due insiemi, e chiamarli da checkresult:

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

Ecco alcuni esempio unione, intersezione, sottrazione e funzioni:

(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: dal momento che questi sono insiemi e l'ordine non importa, i risultati non sono ordinati. Inoltre, le funzioni presuppongono che gli ingressi sono set, e quindi non fare alcun duplicato il controllo al di là di ciò che è richiesto per l'unione.

Altri suggerimenti

Certo che è possibile. Supponendo che si dispone di funzione per calcolare le differenze, intersezione unione etc:

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

Certo che è possibile. Qui ci sono un paio di suggerimenti:

  1. qual è il risultato della combinazione di un elenco e una lista vuota?
  2. Non c'è bisogno di fare tutto in una volta. Prendete un pezzo alla volta.

In cima a Charlie Martin e tomjen delle risposte, io sono venuto con questa fonte:

Unione Intersezione e differenza

L'attuazione delle funzioni distinte può essere trovata con belle spiegazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top