Frage

Ich verwende R5RS Schema und ich möchte nur eine Funktion, dass die Renditen den Schnittpunkt von zwei gegebenen Listen implementieren, aber ich kann das nicht tun, weil ich nicht ein Element zu einer Liste hinzufügen. Hier ist mein Code. Wie kann ich es reparieren? Ich bin wirklich ein Anfänger in Schema -. Das ist meine erste Arbeit mit Schema

thx im voraus ..

(define list3 '())
(define (E7 list1 list2)

        (cond
          ((null? list1)
          list3)
          ((member (car list1) list2) (append list3 (list (car list1))))

        )
  (cond
          ((null? list1)
          list3)
          ((not(null? list1)) (E7 (cdr list1) list2)

        )

     )


)
(E7 '(4 5) '(3 4))
War es hilfreich?

Lösung

Hier ist eine rekursive Version, die die Kreuzung tut anstelle der Union.

(define (intersect list1 list2)
  (cond ((null? list1)   list1)
        ((member (car list1) list2)   (cons (car list1) (intersect (cdr list1) list2)))
        (t   (intersect (cdr list1) list2))))

Andere Tipps

Ich glaube, ich sehe Ihr Problem. Es gibt zwei Möglichkeiten, um ein Element zu einer Liste hinzuzufügen.

Der erste Weg tatsächlich würde es fügt hinzu:

(define (intersect list1 list2)
  (define newlist list2)
  (do ((iter1 list1 (cdr iter1)))
    (not (null? iter1))
    (if (not (member (car iter1) newlist))
        (set! newlist (cons (car iter1) newlist)))))

(Sie werden wahrscheinlich die Definition von do zu sehen, wenn Sie wirklich wollen verwenden.)

Sie können feststellen, dass die ziemlich hässlich ist. Das ist, weil niemand tut es tatsächlich auf diese Weise. Stattdessen müssen Sie erkennen, dass ein Aufruf der Funktion als auch eine neue Variable erstellt. Versuchen Sie folgendes:

(define (intersect list1 list2)
  (cond ((null? list1) list2)
        ((member (car list1) list2) (intersect (cdr list1) list2))
        (else (intersect (cdr list1) (cons (car list1) list2)))))

Wenn Sie mit Algorithmen vertraut sind, werden Sie feststellen, dass der Code, den ich schrieb nur ziemlich langsam ist, aber es zeigt den Punkt: in jedem Fall Sie tun, ein wenig Arbeit und dann Funktion erneut aufrufen. Wenn Sie Probleme beim Sehen haben sind, warum das funktioniert, führen Sie diese Funktion, statt auf Ihrem Beispiel:

(define (intersect list1 list2)
  (display list1) (display " ") (display list2) (newline)
  (cond ((null? list1) list2)
        ((member (car list1) list2) (intersect (cdr list1) list2))
        (else (intersect (cdr list1) (cons (car list1) list2)))))

Hier ist etwas vereinfachend elisp:

(defun is (l1 l2)
  (let ((rtn))
    (mapc
      (lambda (e) 
        (if (member e l1)
          (push e rtn)))
      l2)
    rtn))

Diese verhält sich die gleiche wie die Einbau-Kreuzung für diese einfachen Tests:

(is '(1 2 5) '(1 4 10 5))  => (5 1)
(intersection '(1 2 5) '(1 4 10 5)) => (5 1)

(is '(1 4 10 5) '(1 2 5)) => (5 1)
(intersection '(1 4 10 5) '(1 2 5)) => (5 1)

Du bist besser dran mit Set-Operationen aus Srfl-1.

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