Frage

Ich habe 2 Listen von Elementen '(a b c)' (d b f) und will Unterschiede finden, die Vereinigung und Kreuzung in einem Treffer. Ist das möglich? Wie?

Ich schrieb eine Member-Funktion, die prüft, ob es ein Auto von der ersten Liste in der zweiten Liste ist, aber ich kann nicht ein Mitglied in die neuen Liste werfen.

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

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

sollte Ihr Ergebnis (( a c) (d f) (a b c d f) (b)) werden.

War es hilfreich?

Lösung

Wie schon andere gesagt haben, alles, was Sie tun müssen, um getrennte Funktionen schaffen die Kreuzung, Vereinigung zu berechnen, und Subtraktion der beiden Sätze, und nennen sie von checkresult:

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

Hier sind einige Beispiele Vereinigung, Schnitt und Subtraktion Funktionen:

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

Hinweis: da diese Sätze und Ordnung sind keine Rolle spielt, sind die Ergebnisse nicht sortiert. Außerdem übernehmen die Funktionen, dass die Eingänge sind Sätze, und deshalb keine doppelte tun Kontrolle über das, was für die Union erforderlich ist.

Andere Tipps

Natürlich ist es möglich. Unter der Annahme, dass Sie Funktion haben, die Unterschiede zu berechnen, union Kreuzung etc:

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

Sicher ist es möglich. Hier sind ein paar Hinweise:

  1. was ist das Ergebnis eine Liste und eine leere Liste zu kombinieren?
  2. Sie haben nicht alles auf einmal zu tun. Nehmen Sie ein Stück auf einmal.

Hinzu kommt Charlie Martin und tomjen die Antworten, ich habe mit dieser Quelle kommen:

Union Überschneidung und Difference

Die Umsetzung der verschiedenen Funktionen können mit schönen Erklärungen zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top