创建球拍累加器“变量”

时间:2012-03-09 04:23:48

标签: racket

我真的很难理解如何创建在球拍中充当累加器的变量。这绝对是一个非常愚蠢的问题......但是球拍的文档对我来说很难阅读。

我知道我将使用某种define语句或let语句。

我希望能够将一个数字传递给变量或函数,并且它将当前值与新值相加并保持总和...我将如何做到这一点.... ??谢谢..

(define (accumulator newvalue) "current=current+newvalue" 
像这样......

3 个答案:

答案 0 :(得分:4)

累加器通常只是一个函数参数。 “如何设计程序”(online, starting here)中有几章涵盖了累加器。你读过它们吗?

例如,使用记住列表前缀的累加器实现reverse函数,反转:

;; reverse : list -> list
(define (reverse elems0)
  ;; reverse/accum : list list -> list
  (define (reverse/accum elems reversed-prefix)
    (cond [(null? elems)
           reversed-prefix]
          [else
           (reverse/accum (cdr elems)
                          (cons (car elems) reversed-prefix))]))
  (reverse/accum elems null))

请注意,累加器reversed-prefix的范围仅限于该函数。通过使用该参数的新值调用该函数来更新它。对reverse的不同调用具有不同的累加器,reverse在从一个调用到下一个调用时都不会记住任何内容。

也许您的意思是状态变量。在这种情况下,您define将其let(或将其与lambdaset!绑定)在适当的范围内,并使用;; total : number (define total 0) ;; add-to-total! : number -> number (define (add-to-total! n) (set! total (+ total n)) total) (add-to-total! 5) ;; => 5 (add-to-total! 31) ;; => 36 进行更新。这是一个全局状态变量:

;; make-counter : -> number -> number
(define (make-counter)
  (let ([total 0])
    (lambda (n)
      (set! total (+ total n))
      total)))

(define counterA (make-counter))
(define counterB (make-counter))

(counterA 5) ;; => 5
(counterB 10) ;; => 10
(counterA 15) ;; => 20
(counterB 20) ;; => 30

这是一个创建本地状态变量的变体,因此您可以拥有多个计数器:

{{1}}

但是不要调用状态变量累加器;它会让人感到困惑。

答案 1 :(得分:1)

你的意思是这样吗?

(define (accumulator current newvalue)
  (let ((current (+ current newvalue)))
    ...)

答案 2 :(得分:0)

你可以close over累加器变量:

(define accumulate
  (let ((acc 0))
    (λ (new-val)
      (set! acc (+ acc new-val))
      acc)))

(accumulate 10) ;=> 10
(accumulate 4)  ;=> 14