Scheme 如何在带有闭包的方案中增加值?
如何在带有闭包的方案中增加值?我在上sicp课程的第3A课Scheme 如何在带有闭包的方案中增加值?,scheme,Scheme,如何在带有闭包的方案中增加值?我在上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) 使用set。试试这个: (define (sum VAL) (lambda (x) (set! VAL (add1 VAL)) (* x x V
(define (sum VAL)
// how do I increment VAL everytime i call it?
(lambda(x)
(* x x VAL)))
(define a (sum 5))
(a 3)
使用
set用于存储递增值的代码>。试试这个:
(define (sum VAL)
(lambda (x)
(set! VAL (add1 VAL))
(* x x VAL)))
因为VAL
在调用sum
过程时是封闭的,所以每次调用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
定义的变量,但结果是相同的。但是,如果在初始化VAL
之前需要对n
执行某些操作,这将非常有用:
(define (sum n)
(let ((VAL n))
(lambda (x)
(set! VAL (add1 VAL))
(* x x VAL))))
@Runner3431嗯,是的。。。但这不是必须的。请参阅我的最新答案。