Frage

Das ist eine Hausaufgabe, deshalb möchte ich die Antwort nicht.Ich brauche nur einen Anstoß in die richtige Richtung.Ich muss mehrere Funktionen einer Liste zuordnen.Zum Beispiel:

(map-multi (list plus-one square) '(4 5 6)) => (25 36 49)

Ich kann die erste Funktion den Elementen der Liste zuordnen lassen, aber danach verliere ich mich sehr.Da es sich hierbei um eine Einführung handelt, beschränke ich mich außerdem auf Einführungsfunktionen (const, append, car, cdr, member, usw.)

(define (map-multi f l)  
    (cond  
        ((null? l)  
            l)  
        (else (cons ((car f) (car l))  
            (map-multi f (cdr l))))))  
War es hilfreich?

Lösung

Du brauchst komponieren Die Funktionen, die Sie in der erhalten f Parameter.Nehmen wir der Einfachheit halber an, dass die Liste nur zwei Funktionen enthält. Dann müssen Sie die erste Funktion auf das aktuelle Element in der Zahlenliste anwenden und dann die zweite Funktion auf das Ergebnis anwenden.Wenn Sie das verwenden können compose Fahren Sie mit der Prozedur fort und ändern Sie diese Zeile in Ihrem Code:

((car f) (car l)) ; you're applying only the 1st function! what about the 2nd?

...mit diesem:

((compose (cadr f) (car f)) (car l))       ; now we're applying both functions

Wenn Sie es nicht verwenden können compose, dann ersetzen Sie dieselbe Zeile durch diese:

((cadr f) ((car f) (car l)))               ; now we're applying both functions

Wenn das Problem nun allgemeiner ist und Sie eine Liste von Funktionen zuordnen müssen Mehr als zwei Elemente, dann ersetzen Sie dieselbe Zeile in Ihrem Code noch einmal durch diese:

((compose-multi f) (car l))

Und implementieren Sie eine Hilfsfunktion, die durch aufeinanderfolgende Aufrufe alle Funktionen in der Liste zusammenstellt und zurückgibt compose.Dies bleibt Ihnen als Übung überlassen, da es sich um eine Hausaufgabe handelt. Wenn Sie jedoch verstehen, wie der obige Code nur für zwei Funktionen funktioniert, sollte es einfach genug sein, das Ergebnis auf eine Liste mit mehreren Funktionen zu erweitern:

(define (compose-multi flist)      ; procedure for composing a list of functions
  (if (null? flist)                ; if the list is empty then
      <???>                        ; return the identity function
      (<???> (compose-multi <???>) ; else compose the result of recursive call
             <???>)))              ; with the current element in the list

Beachten Sie, dass die Identitätsfunktion für den Fall erforderlich ist, dass die Liste der Funktionen keine Elemente enthält.Es ist sehr einfach zu definieren, es gibt einfach denselben Wert zurück, der als Parameter übergeben wurde.

Seien Sie sich dessen auch bewusst compose-multi gibt a zurück Funktion, das Ergebnis der Zusammenstellung aller Funktionen in der Liste - compose erledigt dies für Sie, aber wenn Sie es nicht verwenden dürfen, denken Sie daran:

(compose x y)

...ist äquivalent dazu:

(lambda (n) (x (y n)))

Andere Tipps

Es könnte einfacher sein, dies als zwei Funktionen zu schreiben.Man nimmt eine Liste von Funktionen und eine einzelne Eingabe und wendet alle Funktionen in der Liste nacheinander an.Die Ausgabe einer Funktionsanwendung ist die Eingabe für die nächste;Sobald Ihnen die Funktionen ausgehen, sind Sie fertig.

Die andere Funktion ordnet diese Hilfsfunktion einfach einer Liste von Eingaben zu.

Hier ist eine alternative Möglichkeit zur Definition multi-map die anstelle der Komposition die aufgerufene Operation verwendet fold.Da Sie nur Einführungsfunktionen verwenden dürfen, ist dies nicht wirklich die Antwort auf Ihre Aufgabe.Aber es wird so sein, wenn Sie Ihre eigene Definition von schreiben fold (Es ist nicht sehr lang!)

(define (multi-map operations input)
  (fold map input operations))

> (multi-map (list 1+ square)
             '(4 10 8))
$2 = (25 121 81)

> (multi-map (list 1+ square 1+) 
             '(4 10 8))
$3 = (26 122 82)

Beginnen Sie zum Aufwärmen mit einem einfacheren Problem.Verallgemeinern Sie dann die Lösung.

Wie würden Sie diese Funktion schreiben?

(define (map-single fs x)
  ...)

> (map-single (list double add1) 3)
7

Das erfordert eine Liste, fs, von Funktionswerten als Argument und einer Zahl, x, und berechnete den Wert der Anwendung der (Zusammensetzung von) Funktionen in fs Zu x?

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