Wie schreibe ich mehr als einen Ausdruck in if's else in Schläger/Schema?
Nun, das ist nicht wirklich die Frage. Die Frage ist "Wie man ein rollendes Fenster Verfahren mit Schläger bauen?". Wie auch immer, es sieht so aus, als ob Sie wahrscheinlich aus einer anderen Programmiersprache kommen. Die Verarbeitung von verknüpften Listen kann zunächst etwas schwierig sein. Aber denken Sie daran, um die Länge einer Liste zu berechnen, müssen Sie die gesamte Liste durchlaufen. Die Verwendung von length
ist hier ein bisschen ein Anti-Muster.
Stattdessen würde ich empfehlen, erstellen Sie eine aux
iliary Prozedur in Ihrem rolling-window
Verfahren, das das Fenster erstellt, während Sie durch die Liste iterieren. Auf diese Weise müssen Sie Iterationen nicht vergeuden, indem Sie Elemente einer Liste zählen.
Dann, wenn Ihre aux
Prozedur jemals zurückkehrt und leeres Fenster, wissen Sie, dass Sie fertig sind, die Fenster für die angegebene Eingabeliste zu berechnen.
(define (rolling-window n xs)
(define (aux n xs)
(let aux-loop ([n n] [xs xs] [k identity])
(cond [(= n 0) (k empty)] ;; done building sublist, return sublist
[(empty? xs) empty] ;; reached end of xs before n = 0, return empty window
[else (aux-loop (sub1 n) (cdr xs) (λ (rest) (k (cons (car xs) rest))))]))) ;; continue building sublist
(let loop ([xs xs] [window (aux n xs)] [k identity])
(cond ([empty? window] (k empty)) ;; empty window, done
([empty? xs] (k empty)) ;; empty input list, done
(else (loop (cdr xs) (aux n (cdr xs)) (λ (rest) (k (cons window rest)))))))) ;; continue building sublists
(rolling-window 3 '(1 2 3 4 5 6))
;; => '((1 2 3) (2 3 4) (3 4 5) (4 5 6))
Es funktioniert für leere Fenster
(rolling-window 0 '(1 2 3 4 5 6))
;; => '()
Und leere Listen zu
(rolling-window 3 '())
;; => '()
https://docs.racket-lang.org/reference/if.html – coredump
Verwenden Sie 'cond'. Wickeln Sie den Zweig alternativ mit 'begin' oder' let', aber mit 'cond' ist das wahrscheinlich einfacher. –
(take l size) (Rolling-Window (cdr l) size) sollte sowohl im sonst Teil keine Notwendigkeit für eine dritte Alternative – X10D