【问题标题】:create racket accumulator "variable"创建球拍累加器“变量”
【发布时间】:2012-03-09 04:23:48
【问题描述】:

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

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

我希望能够将一个数字传递给一个变量或函数,并将当前值与新值相加保持总和......我该怎么做......?谢谢。。

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

类似的东西..

【问题讨论】:

    标签: racket


    【解决方案1】:

    累加器通常只是一个函数参数。 How to Design Programs (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
    

    但不要将状态变量称为累加器;它会让人们感到困惑。

    【讨论】:

      【解决方案2】:

      你的意思是这样的吗?

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

      【讨论】:

      • 没有。我希望能够为其添加越来越多的值.....我应该能够调用累加器 3 次并每次添加 3 ......并且每次它显示前一个添加的 3。跨度>
      【解决方案3】:

      你可以close over累加器变量:

      (define accumulate
        (let ((acc 0))
          (λ (new-val)
            (set! acc (+ acc new-val))
            acc)))
      
      (accumulate 10) ;=> 10
      (accumulate 4)  ;=> 14
      

      【讨论】:

        猜你喜欢
        • 2015-06-08
        • 2022-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多