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 № 1Aggiungi 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) <))