Verwendung von lokalen im Racket/Scheme
In der Übung 18.1.12 von htdp, ich habe neu geschrieben, die maxi-Funktion mit "local".
;; maxi : non-empty-lon -> number
;; to determine the largest number on alon
(define (maxi alon)
(cond
[(empty? (rest alon)) (first alon)]
[else (local ((define m (maxi (rest alon))))
(cond
[(> (first alon) m) (first alon)]
[(> m (first (rest alon))) m]
[else (first (rest alon))]))]))
Ich bin mir nicht sicher, deshalb würde ich dies im "real life" wie es scheint, die Buch-version ist kürzer, übersichtlicher und vermutlich auch schneller.
(define (maxi alon)
(cond
[(empty? (rest alon)) (first alon)]
[else (cond
[(> (first alon) (maxi (rest alon))) (first alon)]
[else (maxi (rest alon))])]))
War es dazu gedacht, eine rein pädagogische übung? Könnte ein erfahrener Intrigant Kommentar auf den obigen code? Danke.
- Gut, hier ist ein sokratische Frage für dich: Warum denkst du, dass die nicht-
local
version "ist wohl schneller"? Ich werde eine wirkliche Antwort auf diese Frage, nach dem hören Ihre Gedanken. 🙂 - Sifu Chris, danke für meine ANNAHMEN zu hinterfragen. Ich Lerne zu schätzen Ihre Einsicht mehr und mehr. Es scheint also, dass die "lokale" version ist viel schneller als die "reinen" rekursive version, wenn die Liste wird groß. Ich kam zu dieser Schlussfolgerung durch den Aufruf der time-Funktion auf eine Liste mit 20 zahlen und war erstaunt zu sehen, ein Durchschnitt von 550x Unterschied in der Leistung. Ich weiß nicht, wie Racket/Scheme arbeitet intern zu erklären, die Diskrepanz aber. Stepping durch die "lokale" version scheint zu zeigen, dass 20 Versionen des local-Funktion "m" - produzieren einen Wert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Persönlich, ich denke, das ist ein schlechtes Beispiel für die Bedeutung von
local
und ich glaube nicht, dass Sie vollständig verstanden die Wichtigkeit der Frage, was ich tun ist, gehen durch das Konzept, dass Sie bemerken sollten, dann gehen Sie durch Ihr Beispiel und schließlich geben Sie ein besseres Beispiel.KONZEPT
First off, die Idee der lokalen hier (unter viele andere Dinge) ist die Klärung der Bedeutung von code-snippets.
IHREM BEISPIEL
Betrachten wir dein Beispiel definieren Sie eine lokale Konstante genannt
m
was richtig zu sein scheint. Obwohl, da der Briefm
hat keine Bedeutung Ihre Lösung scheint unklar zu sein. Also, wie können wir beheben Ihre Lösung?Brauchen wir, um
m
einen Namen, der klar identifiziert, wasm
darstellt. So, wir beginnen, indem wir direkt überlegen, wasm
stellt die(maxi (rest alon))
Gut
(maxi (rest alon))
sagt einfach, finden Sie die maximale Anzahl der(rest alon)
So ermöglicht das umbenennen
m
zufind-max
Nun dein code sieht wie folgt aus:
Ersetzen
m
mitfind-max
macht den code viel übersichtlicher! Verlassen uns mit einem Faustregel, geben Sie Ihrem Konstanten aussagekräftige Namen.MEINEM BEISPIEL
Weiter zu verdeutlichen, betrachten wir eine Funktion, verbraucht nur zwei Punkte und ergibt die Steigung der geraden segment erstellt, indem die zwei Punkte. Unser Erster Ansatz könnte sein:
Aber wir könnten klarer sein, mit
local
:Beachten Sie, wie delta beschreibt, was die Funktion tut, die diesen Teil; der Suche nach die änderung in x-oder y -. Also, was müssen wir hier lernen, ist, dass, obwohl die erste Lösung können Sie weniger code, die zweite Lösung beschreibt, was wir tun und können einfach gelesen werden. Das war die ganze Idee, die Frage, und es mag dumm, aber es ist eine Konvention, die Sie neigen dazu, stress beim lernen-Schema in einem akademischen Umfeld.
Als für die Effizienz der ersten und zweiten Lösung, die zweite Lösung ist auf jeden Fall viel schneller aus offensichtlichen Gründen (nachdem Sie sich ansehen, wie Schläger wertet Ausdrücke), aber das war nicht der Hauptzweck der Frage.
Hoffe, das hilft
Anstatt
local
kann man gehen, wie auch mit Schläger internen Definitionen (insbesondere mit neueren Versionen).Beispiel:
local
.Verwendung von local ist schneller, weil hier nur bewertet
(maxi (rest alon))
einmal pro Rekursion, in der Erwägung, dass mit der zweiten version wertet er(maxi (rest alon))
zweimal, wenn es um den letzten Fall.Lokalen speichert das Ergebnis, damit Sie nicht die gleiche Arbeit zweimal.