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.
InformationsquelleAutor Greenhorn | 2010-12-30
Schreibe einen Kommentar