创建球拍累加器“变量”
我真的有问题,了解如何创建变量,将作为在球拍累加器。这绝对是一个非常愚蠢的问题....但拍的文档是相当困难的,我阅读。创建球拍累加器“变量”
我知道我会使用某种类型的定义语句或让语句。
我希望能够为数字传递给一个变量或函数,并用新的值保持总和......我将如何做到这一点增加了电流值....?谢谢。
(define (accumulator newvalue) "current=current+newvalue"
这样的事情..
累加器通常只是一个函数参数。有在程序设计方法,涵盖蓄电池(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
但不叫状态变量蓄电池;它会混淆人们。
你的意思是这样?
(define (accumulator current newvalue)
(let ((current (+ current newvalue)))
...)
号我希望能够越来越多值添加到它.....我应该能够调用累加器3次,每次加3时间.....每次它显示前加入3. – Rell3oT 2012-03-09 07:21:58
可以close over累加器变量:
(define accumulate
(let ((acc 0))
(λ (new-val)
(set! acc (+ acc new-val))
acc)))
(accumulate 10) ;=> 10
(accumulate 4) ;=> 14
非常感谢。 – Rell3oT 2012-03-09 17:05:12
比你了!这是非常丰富的 – Rell3oT 2012-03-09 17:05:25