/ / Unisci senza duplicati - schema, racchetta

Unisci senza duplicati - schema, racchetta

Voglio implementare una funzione di unione nello schema ma senza duplicati, cioè quando ho per esempio (merge "(1 2 8) "(2 5 6)) dovrebbe tornare "(1 2 5 6 8) e non "(1 2 2 5 6 8). Il mio codice corrente restituisce il secondo risultato:

(define (merge lst1 lst2)
(cond ((null? lst1) lst2)
((null? lst2) lst1)
((>= (car lst1) (car lst2))
(cons (car lst2) (merge lst1 (cdr lst2))))
(else
(cons (car lst1) (merge (cdr lst1) lst2)))))

risposte:

1 per risposta № 1

Aggiungi un'altra clausola al cond dichiarazione per gestire separatamente il caso di elementi uguali:

> (define (merge lst1 lst2)
(cond ((null? lst1) lst2)
((null? lst2) lst1)
((> (car lst1) (car lst2))
(cons (car lst2) (merge lst1 (cdr lst2))))
((> (car lst2) (car lst1))
(cons (car lst1) (merge lst2 (cdr lst1))))
(else
(merge (cdr lst1) lst2))))
> (merge "(1 2 8) "(2 5 6))
(1 2 5 6 8)

0 per risposta № 2

Dato che hai usato il tag racket, presumo che tu abbia accesso alle funzioni del racket. In tal caso, puoi farlo con set-union. Il set-union la funzione opera su set generici e una lista soddisfa il generic-set? interfaccia. In alternativa potresti usare append e remove-duplicates, ma set-union si prende cura di ciò con una sola chiamata.

Se si desidera anche ordinare l'elenco risultante, è possibile utilizzare sort, usando < come il tuo operatore.

Compilando tutti questi insieme ottieni:

(define (sorted-merge lst1 lst2)
(sort (set-union lst1 lst2) <))