球拍:在矢量上滑动 window

Racket: sliding window over a vector

有哪些在 Racket 中对有限序列执行滑动 window 的好方法,例如找到 4 个数字的任意子序列的最大总和?

(define example #(3 1 4 5 10 23 1 50 0 12 40 12 43 20))

先求前缀和:

#lang racket
(define example #(3 1 4 5 10 23 1 50 0 12 40 12 43 20))

(define-values (sums sum)
  (for/fold ([sums '()] [sum 0]) ([x example])
    (values (cons sum sums) (+ sum x))))
(list->vector (cons sum sums))

结果:

'#(224 204 161 149 109 97 97 47 46 23 13 8 4 3 0)

然后...利润。

利润可能是这样的:

#lang racket
(define example #(3 1 4 5 10 23 1 50 0 12 40 12 43 20))

(define (prefix-sums xs)
  (define-values (sums sum)
    (for/fold ([sums '()] [sum 0]) ([x xs])
      (values (cons sum sums) (+ sum x))))
  (list->vector (reverse (cons sum sums))))

(define (sum4 xs i)
  (- (vector-ref xs (+ i 4))
     (vector-ref xs    i)))

(define (sum4s xs)
  (for/list ([i (- (vector-length xs) 4)])
    (sum4 (prefix-sums xs) i)))

(apply max (sum4s example))