나는 아마이 for/fold
지능형리스트를 사용하여 작성합니다
(define (weights-to-range weights)
(define-values (xs _)
(for/fold ([xs '()] [prev 0])
([weight (in-list weights)])
(define this (+ prev weight))
(values (cons this xs) this)))
(reverse xs))
(require rackunit)
(check-equal? (weights-to-range '(1 4 6 6 6 6 6))
'(1 5 11 17 23 29 35))
이이 fold/fold
에 두 개의 누적 값을 제공하기 때문에 그것은, 것을 제외하고도 간단한 것 - xs
및 prev
- - for/fold
양식은 두 개의 값을 반환합니다. xs
에서 - - reverse
에 그래서 우리는 모두 우리가 관심을 전달하기 전에, define-values
를 사용하여 일시적으로 바르에 정력해야합니다. (prev
에 대한 VAR는 _
지정됩니다. 우리가 그것을 필요로하지 않기 때문에 즉, "무시"를 의미 단지 컨벤션입니다.) 물론
, 여기에 일반적인 생각은을 사용하여 목록을 "배"하는 것입니다 쌍의 "슬라이딩 윈도우 (sliding window)"로 각 단계마다 누적 결과를 이용할 수 있습니다. 귀하의 경우, 함수는 +
이지만 일반화 될 수있다 :
(define (fold-slide f vs)
(define-values (xs _)
(for/fold ([xs '()] [prev 0])
([v (in-list vs)])
(define this (f prev v))
(values (cons this xs) this)))
(reverse xs))
을 같은 fold-slide
기능 (더 나은 이름의 부족), 당신은 단순히 작성한 수와 함께 :
(fold-slide + '(1 4 6 6 6 6 6)
이러한 그것은 단지 2
PS, 어떤 크기의 "창"을 처리 할 수있는 경우 fold-slide
더욱 유용 할 수 있습니다 SRFI에서 이와 같은 작업을 수행 할 수있는 가능성이 있습니다. 아니면 내가 모르는 Racket에서보다 우아한 방법을 사용할 수도 있습니다.
출력의 초기 0이 암시한다고 생각하십니까? –