Erläuterungen zu Racket / Scheme Flatten
Kann mir jemand helfen, die Ausführungsreihenfolge für die folgenden Versionen von flatten genau aufzuschlüsseln? Ich benutze Racket.
Version 1 ist vom Schläger selbst, während Version zwei eine häufigere ist? Implementierung.
(define (flatten1 list)
(let loop ([l list] [acc null])
(printf "l = ~a acc = ~a\n" l acc)
(cond [(null? l) acc]
[(pair? l) (loop (car l) (loop (cdr l) acc))]
[else (cons l acc)])))
(define (flatten2 l)
(printf "l = ~a\n" l)
(cond [(null? l) null]
[(atom? l) (list l)]
[else (append (flatten2 (car l)) (flatten2 (cdr l)))]))
Wenn Sie nun das erste Beispiel mit '(1 2 3) ausführen, erhalten Sie:
l = (1 2 3) acc = ()
l = (2 3) acc = ()
l = (3) acc = ()
l = () acc = ()
l = 3 acc = ()
l = 2 acc = (3)
l = 1 acc = (2 3)
'(1 2 3)
während die zweite erzeugt:
l = (1 2 3)
l = 1
l = (2 3)
l = 2
l = (3)
l = 3
l = ()
'(1 2 3)
Die Reihenfolge der Ausführung scheint anders zu sein. Im ersten Beispiel sieht es wie die zweite Schleife aus(loop (cdr l) acc)
wird vor der ersten Schleife ausgelöst, da '(2 3) sofort gedruckt wird. Während im zweiten Beispiel 1 vor '(2 3) gedruckt wird, wird zuerst der erste Aufruf zum Abflachen innerhalb von append ausgewertet.
Ich gehe durch den Kleinen Schemer, aber dies sind schwierigere Beispiele, bei denen ich wirklich Hilfe gebrauchen könnte.
Danke vielmals.