2016-04-02 24 views
0

Ich versuche, eine Funktion (last) zu erstellen, die eine Funktion (f) und eine Liste als Parameter verwendet. Die Liste wird an die Funktion übergeben (odd?) Und wenn das letzte Element in der Liste ungerade ist, gibt es true (#t) zurück, sonst gibt es false (#f) zurück. Aber der folgende Code funktioniert nicht, was ist der richtige Weg um die Funktion als Parameter zu deklarieren.Übergeben einer Funktion als Parameter in Schema

(define (last f L) 
(if (null? L) '() (last f (cdr L)))) 

(letzte ungerade? ‚(0 5 3 8 6 7))

+0

Sie müssen die Funktion nicht als Parameter deklarieren; Ihr Problem ist völlig unabhängig. Um den inneren Ausdruck herum haben Sie einen zusätzlichen Satz von Parens, also sollte der Aufruf einfach so lauten: '(letzte ungerade? '(0 5 3 8 6 7))'. –

+0

Danke für das Aufzeigen. Ich habe meine Frage basierend auf Ihrem Kommentar bearbeitet. – Siva

Antwort

1

Hier ist ein wie Sie eine Lösung mit nur eingebauten Funktionen schreiben können, beachten Sie die richtige Syntax für die Übergabe einer Prozedur als Parameter und auch, dass es eine schlechte Idee ist, Ihre Funktion als last zu nennen, kollidiert mit einem bestehenden Verfahren, das gleiche, das Sie verwenden sollten, um das Problem zu lösen!

(define (my-last f L) 
    (f (last L))) 

Wenn Sie auf jeden Fall die Funktion von Grund auf neu zu schreiben, stellen Sie sicher, dass Sie verstehen, welche Basis Fälle benötigt werden:

(define (my-last f L) 
    (cond ((null? L) #f) 
     ((null? (cdr L)) (f (car L))) 
     (else (my-last f (cdr L))))) 

So oder so, es funktioniert wie erwartet:

(my-last odd? '(0 5 3 8 6 7)) 
=> #t 
+0

Gibt es eine Möglichkeit, die Lösung zu schreiben, ohne die 'last' Funktion zu benutzen? '(definieren (meine-letzte f L) (wenn (null? L) '() (meine-letzte f (cdr L))))' – Siva

+1

@SivabalanBalasubramanian sicher, indem Sie Ihre eigene 'last' Funktion schreiben, aber Sie sollten nicht - immer vorziehen, eingebaute, vorhandene Funktionen zu verwenden: erfinden Sie das Rad nicht neu;) –

-1

Denn wie Sie die Funktion geschrieben, haben Sie eine zusätzliche Klammern im Rufaufbau. Es sollte nur (last odd? '(0 5 3 8 6 7)) sein, wie jemand Sie in den Kommentaren vorgeschlagen hat.

Verwandte Themen