我真的很难理解如何创建在球拍中充当累加器的变量。这绝对是一个非常愚蠢的问题......但是球拍的文档对我来说很难阅读。
我知道我将使用某种define语句或let语句。
我希望能够将一个数字传递给变量或函数,并且它将当前值与新值相加并保持总和...我将如何做到这一点.... ??谢谢..
(define (accumulator newvalue) "current=current+newvalue"
像这样......
答案 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
(或将其与lambda
或set!
绑定)在适当的范围内,并使用;; 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