2017-02-27 4 views
-1

Ich schrieb diesen Code (in vollem Racket) zu finden, wenn ein Satz eine Untermenge eines anderen ist, können Sie mir sagen, was los ist?Was ist los mit diesem Schläger-Code?

(struct myset (lst)) 

(define (member? a lst) 
(cond 
[(empty? lst) false] 
[(equal? a (first lst)) true] 
[else (member? a (rest lst))])) 

;; (subset? a b) determines if a is a subset of b 
;; subset?: Set Set -> Bool 
(define (subset? a b) 
(cond 
[(empty? (myset-lst a)) true] 
[(empty? (myset-lst b)) false] 
[(member? (first (myset-lst a)) (myset-lst b)) 
    (subset? (rest (myset-lst a)) (myset-lst b))] 
[else false])) 
+2

Ist es ein Fehler zu werfen? Wenn ja, was und wo? Wenn kein Fehler vorliegt, beschreiben Sie Ihr Problem. –

Antwort

0

Sie ändern den Typ des übergebenen Arguments. Im Aufruf an subset? übergeben Sie eine Struktur mit einem Listenmitglied. Wenn Sie rekursiv sind, übergeben Sie die Liste (rest (myset-lst a)) und die Liste (myset-lst b). In der Rekursion wird es versuchen, (myset-lst a) zu tun, um die Liste zu erhalten, aber es wird fehlschlagen, da a keine myset-Struktur ist, sondern eine Liste.

Sie sollten entweder nur die Sätze als Listen behalten (keine Strukturen verwenden) oder Sie müssen die Rekursionen umbrechen, also (myset (rest (myset-lst a))), um eine neue Menge ohne das erste Element zu erstellen. Warum Sie in der Rekursion b ändern, ist ein Mysterium.

Wenn Sie Structs brauchen Sie nur einen Helfer verwenden:

(define (subset? subset set) 
    (define set-lst (myset-lst set)) 
    (define (helper subset-lst) 
    ...) 
    (helper (myset-lst subset)))