【问题标题】:How can I increment a value in scheme with closure?如何在关闭的方案中增加一个值?
【发布时间】:2014-09-25 04:57:11
【问题描述】:

如何在带有闭包的方案中增加一个值?我正在上 sicp 课程的第 3A 课。

(define (sum VAL)

    // how do I increment VAL everytime i call it?

    (lambda(x)  
        (* x x VAL)))

(define a (sum 5))

(a 3)

【问题讨论】:

    标签: scheme


    【解决方案1】:

    使用set! 存储增量值。试试这个:

    (define (sum VAL)
      (lambda (x)
        (set! VAL (add1 VAL))
        (* x x VAL)))
    

    因为在调用sum 过程时包含VAL,所以每次调用a 时,它都会“记住”VAL 中的前一个值,并且会增加一个单位。例如:

    (define a (sum 5)) ; VAL = 5
    
    (a 3)  ; VAL = 6
    => 54  ; (* 3 3 6)
    
    (a 3)  ; VAL = 7
    => 63  ; (* 3 3 7)
    

    回复评论:当然,你可以使用let,但这不是必须的,它和之前的效果一样。不同之处在于,在前面的代码中我们修改了一个封闭的函数参数,现在我们修改了一个封闭的let-defined 变量,但结果是相同的。但是,如果您需要在初始化 VAL 之前对 n 执行一些操作,这将很有用:

    (define (sum n)
      (let ((VAL n))
        (lambda (x)
          (set! VAL (add1 VAL))
          (* x x VAL))))
    

    【讨论】:

    • @runners3431 好吧,是的……但这不是必需的。请参阅我的更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2013-02-23
    相关资源
    最近更新 更多