2017-04-17 6 views
-1

Ich versuche, eine Funktion in Scheme zu schreiben, die eine Liste als ein Argument nimmt und eine Liste zurückgibt, die nur die geraden ganzen Zahlen aus der Argumentliste enthält. Nachdem durch das Problem arbeiten, ist es das, was ich habe kommen mit:Scheme-Funktion zum Erstellen einer Liste von geraden ganzen Zahlen

(define (even-list n) 
    (if (even? car(n)) 
     (cons car(n) even-list(cdr(n))) 
     (even-list cdr(n)) 
    ) 
) 

meine Funktion zu testen even-list Ich habe eine kleine Liste gebaut als Argument an die Funktion übergeben. Allerdings, wenn ich den Code unten laufen, alles, was geschieht, ist, dass die Liste ausgegeben wird:

even-list (list 1 2 3 4 5 6 7 8 9 10) 

Es scheint fast wie es nicht einmal die Funktion aufrufen, wie ich die then Klausel mit "even" und "even" ersetzt wurde nie ausgegeben. Irgendwelche Ideen?

+0

das ist nicht gültig Schema/Schläger ... Syntaxfehler beheben, bevor Fragen veröffentlichen. – naomik

Antwort

2

Beachten Sie, dass das Schema/Racket prefix Notation verwendet, wobei jede angewendete Prozedur um die öffnenden und schließenden Klammern (function-name arg1 arg2 ...) gewickelt wird.

Das bedeutet, dass car(n), cdr(n), even-list(...) usw. sind ungültige Syntax und sollte mit (car n), (cdr n), (even-list ...) usw. bzw. ersetzt werden.

Dies ist auch, warum Sie nicht alle Änderungen in der Ausgabe zu sehen, wenn

even-list (list 1 2 3 4 5 6 7 8 9 10) 

Schreiben Änderungen an Ihrem Verfahren even-list, denn mit einfach machen Sie eine Kennung (even-list) fordern, die nicht gebunden sein kann/können (In diesem Fall ist es mit der Funktionsdefinition verbunden), und der Ausdruck (list 1 2 3 4 5 6 7 8 9 10). Dieser Ausdruck gibt Ihre Listenausgabe zurück, und alle Änderungen, die Sie innerhalb von even-list vornehmen, werden in dieser Liste nicht wiedergegeben, da Sie sie nicht als Argument für eine Prozedur übergeben haben, sondern einfach unter Verwendung der integrierten list angewendet haben Verfahren.

Sobald Sie die Linie festsetzt:

(even-list (list 1 2 3 4 5 6 7 8 9 10)) 

Sie werden beginnen, um Fehler zu bemerken, die von der Prozedur Logik stammen. Zum Beispiel hat Ihre recursive Funktion keinen Basisfall, was bedeutet, dass wenn die Funktion durch die Liste recursiert, wenn sie eine Liste von Nullelementen '() erreicht, versucht sie immer noch (car n) anzuwenden, was eine Vertragsverletzung auf car ist, da sie ein erwartet pair? für ein Argument.

Beachten Sie Folgendes:

(define (even-list lst) 
    (cond 
    ((null? lst) empty)       ; base case (empty? list) 
    ((even? (car lst))       ; even? first element 
    (cons (car lst) (even-list (cdr lst)))) 
    (else (even-list (cdr lst))))) 

oder, built-in mit filter Verfahren:

(define (even-list lst) 
    (filter even? lst)) 
Verwandte Themen