2012-03-09 136 views
1

我真的有問題,瞭解如何創建變量,將作爲在球拍累加器。這絕對是一個非常愚蠢的問題....但拍的文檔是相當困難的,我閱讀。創建球拍累加器「變量」

我知道我會使用某種類型的定義語句或讓語句。

我希望能夠爲數字傳遞給一個變量或函數,並用新的值保持總和......我將如何做到這一點增加了電流值....?謝謝。

(define (accumulator newvalue) "current=current+newvalue" 

這樣的事情..

回答

5

累加器通常只是一個函數參數。有在程序設計方法,涵蓋蓄電池(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

1

你的意思是這樣?

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

號我希望能夠越來越多值添加到它.....我應該能夠調用累加器3次,每次加3時間.....每次它顯示前加入3. – Rell3oT 2012-03-09 07:21:58

1

可以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