创建球拍累加器“变量”

问题描述:

我真的有问题,了解如何创建变量,将作为在球拍累加器。这绝对是一个非常愚蠢的问题....但拍的文档是相当困难的,我阅读。创建球拍累加器“变量”

我知道我会使用某种类型的定义语句或让语句。

我希望能够为数字传递给一个变量或函数,并用新的值保持总和......我将如何做到这一点增加了电流值....?谢谢。

(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(或将其与letlambda绑定),并使用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 

但不叫状态变量蓄电池;它会混淆人们。

+0

比你了!这是非常丰富的 – Rell3oT 2012-03-09 17:05:25

你的意思是这样?

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

号我希望能够越来越多值添加到它.....我应该能够调用累加器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 
+0

非常感谢。 – Rell3oT 2012-03-09 17:05:12