在SICP讲座2a中,我对(average (f x) x)
感到困惑。它不仅仅是(average f x)
。 f
是不是lambda
已经代表(/ x y)
了?为什么我需要(average (f x) x)
?有人可以用替换方法帮我解决这个问题吗?
(define (sqrt x)
(fixed-point
(average-damp (λ (y) (/ x y)))
1))
(define average-damp
(λ (f)
(λ (x) (average (f x) x))))
答案 0 :(得分:2)
此片段:
(average (f x) x)
意味着与此不同的是:
(average (f) x)
对于初学者,f
是一个函数,它需要一个参数,在这种情况下必须是x
,因此我们说(f x)
。如果您写(f)
,则尝试在没有参数的情况下调用f
,从而导致错误。在使用average-damp
参数的值调用它后用f
替换,我们发现它返回另一个 lambda
,这是:
(λ (x)
(average ((λ (y) (/ x y)) x) x))
正如您所看到的,在此表达式((λ (y) (/ x y)) x)
中,x
作为参数传递给(λ (y) (/ x y)) x)
(f
},x
绑定到y
参数。不要混淆!因为现在我们有:
(/ x x)
但此时的第一个x
不是变量,它是调用sqrt
时在闭包中捕获的值,而第二个x
是我们刚刚返回的lambda
中的参数,并且在调用它之前仍然未绑定,可能是fixed-point
。