2017-04-09 2 views
0

Ich habe zwar eine Liste aufgerufen und überprüft, ob es gerade oder ungerade wäre, würde so funktionieren. Es wird angenommen, eine Liste [2 6 4 5] zu nehmen und jedes Element zu prüfen, das an einer geraden Position ist und t oder f zu drucken. [2 #t 4 #f]. Ich weiß, dass ich versuche, Modulo auf einer Liste zu machen, was wahrscheinlich den Fehler verursacht. Gibt es eine Möglichkeit, nach der aktuellen Liste zu suchen und zu prüfen, ob sie gerade oder ungerade ist?Vertragsverletzungsschema Logik

modulo: contract violation 
expected: integer? 
given: '(2 3 4) 
argument position: 1st 
other arguments...: 

(define (isEven E) 
    (if(= (modulo E 2) 0) #t #f)) 

    (define (evenEE L) 
    (if (or (null? L) (null? (cdr L))) 
    L 
    (cons (car L) 
      (cons (isEven) 
        (evenEE (cddr L)) 
        )))) 

Antwort

0

Ihr Code wendet das Prädikat nicht korrekt an. In der Definition von evenEE:

(define (evenEE L) 
    (if (or (null? L) (null? (cdr L))) 
    L 
    (cons (car L) 
      (cons (isEven) 
        (evenEE (cddr L)) 
        )))) 

Sie müssen (isEven) mit (isEven (cadr L)) ersetzen. Das ruft isEven mit dem zweiten Element in der Liste auf. Basierend auf der Fehlermeldung, die Sie angegeben haben, vermute ich, dass Sie es zuvor als (isEven (cdr L)) hatten. Das würde versuchen zu testen, ob der gesamte Schwanz der Leste gerade ist, was keinen Sinn ergeben würde.

Nebenbei ist die if-Form in isEven redundant.

(define (isEven E) 
    (= (modulo E 2) 0)) 

(define (evenEE L) 
    (if (or (null? L) (null? (cdr L))) 
    L 
    (cons (car L) 
      (cons (isEven (cadr L)) 
       (evenEE (cddr L)))))) 

Testen Sie es aus:

> (evenEE '(2 6 4 5)) 
'(2 #t 4 #f) 
+0

Sie haben Recht, cdr würden Sie können

(define (isEven E) (= (modulo E 2) 0)) 

Also das ganze Programm sollte wie folgt aussehen

(define (isEven E) (if(= (modulo E 2) 0) #t #f)) 

mit ersetzen schau dir die ganze Liste an. Cadr würde nur auf das Currentelement schauen. – Learning

+0

@Learning Froh, dass ich helfen könnte. Wenn Sie zufrieden sind, können Sie die Antwort als akzeptiert markieren. –