Schema - Map-Funktion für die Anwendung einer Funktion auf die Elemente in einer verschachtelten Liste
Ich versuche zu schreiben, ein mapping-Funktion in Schema wendet eine Funktion auf jeden Wert in eine geschachtelte Liste.
Beispielsweise (map number? '(3 (2 A) 2 Z)
zurückkehren sollte (#t (#t #f) #t #f)
Hier ist, was ich habe, so weit:
(define (map fun lst)
(if (null? lst) '()
(if (list? (car lst))
(cons (map fun (car lst)) (map fun (cdr lst)))
(cons (fun (car lst)) (map fun (cdr lst))))))
Es funktioniert, wenn sich die verschachtelte Liste ist auf der Vorderseite der Liste. Zum Beispiel (map number? '((3 A) 2 Z))
richtig zurück ((#t #f) #t #f)
Das problem tritt auf, wenn sich die verschachtelte Liste tritt auf, nachdem ein weiteres element der ursprünglichen Liste.
Zum Beispiel (map number? '(3 A (2 Z)))
falsch zurück (#t #f #f)
[Das Ergebnis sollte (#t #f (#t #f))
]
Wie kann ich mein Algorithmus, um dies zu korrigieren?
InformationsquelleAutor ben.coffee | 2011-04-18
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist meine Lösung---es ist ernst Billig, dass es verwendet das eingebaute
map
mit der Dekorator-Muster. (Ich weiß, das Schema-Programme mit Hilfe von design patterns? :-O)Sein kann "vereinfachte" sogar noch weiter, indem Sie eine benannte
let
:(Die zwei code-snippets sind nicht identisch, aber für diese Frage, sind beide die selben, wenn gegeben, eine Liste als Eingabe.)
Den
null?
undpair?
Prüfungen (beide O(1)) verwendet werden, um zu vermeiden, mitlist?
(was ist O(n)).map
ist in der Regel schwer genug ist, um nicht inlined. So, während Sie könnte billiger sein, in einigen Fällen, die behaupten, dass es immer billiger ist falsch.(cons (map ...) (map ...))
das ist ein kleiner Vorteil, aber das Ergebnis ist deutlicher aus Pädagogischer POV... (Und in den Prozess Sie etwas bekommen, das ist mehr generisch, aber das ist natürlich irrelevant für die Frage.)pair?
bedeutet nicht, dass eine Liste - das wird nicht für(a (b . c) d)
mit "(b . c) ist nicht eine richtige Liste". Sie können nicht verhindern, dass die Zahlung O(n) auflist?
seit das ist, wasmap
erfordertIhr code korrekt ist, außer, dass es viel zu ausführlich, als es sein könnte. Hinweis: Sie brauchen, um über nur zwei Fälle: ob
lst
ist einpair?
oder nicht. Das ist alles. In anderen Worten, der code wird davon ausgegangen, dass die Eingabe wird immer eine Liste, aber es vereinfacht werden könnte, alles zu akzeptieren, und tun, die spezielle rekursive Sache, wenn es ein paar.Als für das problem, das Sie sehen-meine Vermutung ist, dass Sie mit Schläger, und deshalb läufst du gegen eine seltsame Fall. Ist dies nicht der Fall ist, dann können Sie hier aufhören zu Lesen.
Die Sache ist, dass Schläger die Funktion selbst kompilieren, bevor die Bindung zu
map
gemacht, daher diemap
Anrufe sind nicht wirklich rekursiv, sondern Sie sind nur Anrufe zu den integriertenmap
. Spätermap
(Rück-)gebunden, um die resultierende Funktion, aber die rekursiven Aufrufe wurden bereits zusammengestellt. Wenn Sie geben die gleiche definition zweimal, du wirst sehen, dass es wieder beginnt. Die Art und Weise, dies zu lösen, ist einfach nicht zu arbeiten an der REPL, und statt immer zu schreiben, die Definitionen in eine Datei, die beginnt mit einigen#lang <something>
.(list 1)
ist das gleiche wie(cons 1 '())
(Liste aus ein paar), und(list 1 2 3)
ist das gleiche wie(cons 1 (cons 2 (cons 3 '())))
(Liste bestehend aus drei Paaren). In Scheme können Sie testen, für Paare mitpair?
.