这是从SICP视频讲座,第2a讲39:51分左右开始的。
(DEFINE (SQRT X)
(FIXED-POINT
(AVERAGE-DAMP (LAMBDA Y (/ X Y)))
1))
(DEFINE AVERAGE-DAMP
(LAMBDA f
(LAMBDA x (AVERAGE (f x) x))))第二个lambda中的x在AVERAGE-DAMP中做了什么,它是如何被访问的?我不明白传递给它的到底是什么。
发布于 2012-05-28 18:14:19
(DEFINE AVERAGE-DAMP
(LAMBDA f
(LAMBDA x (AVERAGE (f x) x))))这里的棘手之处在于,这里传递了一个函数。
average-damp是f的函数,它被定义为x的函数,它被定义为f(x) ("f of x")和x的平均值。
换句话说,average-damp是一个函数,它接受另一个函数,在它周围包装一个函数,然后返回这个新函数。
如果您碰巧熟悉JavaScript,这可能会有所帮助:
function average(a, b) {
return (a + b)/2;
}
function averageDamp(f) {
return function(x) {
return average(f(x), x);
}
}那么现在想一想,下面是什么?
var something = averageDamp(function (c) { return c * 2 });something是一个函数,它接受一个参数x,并返回x *2和x的平均值。
换句话说,它就像:
function (x) {
return average(x * 2, x);
}如果你有:
var something = averageDamp(function (c) { return c * 2 });
something(5); //average(5*2, 5) = (10 + 5) / 2在函数中包装函数就是您的lisp代码片段所发生的事情。
编辑:出于好奇,我在JavaScript:http://jsfiddle.net/tXDQL/中完全实现了一个定点sqrt方法。
发布于 2012-05-28 18:15:53
x的值将是fixed-point传递给函数的参数。
现在您没有提供fixed-point的定义,但从名称我可以想象,它将首先调用带有参数1的函数(因为这是作为fixed-point的第二个参数提供的),然后将继续使用其先前的结果作为参数调用函数,直到结果与先前的结果相同。
因此,在第一次调用时,x将为1,在第二次调用中将为(average (f 1) 1),在第三次调用中将为(average (f (average (f 1) 1)) (average (f 1) 1)),依此类推。
发布于 2012-05-28 18:16:59
AVERAGE-DAMP只是被定义为一个函数(一个λ),当给定一个参数f时,返回另一个函数(另一个λ),当给定一个参数x时,该函数计算x和f(x)的平均值,其中f是之前接收到的函数。
然后,在SQRT中,注意AVERAGE-DAMP是如何用一个参数(恰好是一个函数,一个lambda)调用的。这会将调用转换为另一个函数(AVERAGE-DAMP中的第二个lamda函数),该函数在给定一个值的情况下,将该给定函数(LAMBDA Y (/ X Y))求值为给定值。FIXED-POINT函数将负责获取该函数,并针对它认为合适的每个值计算前一个函数。
https://stackoverflow.com/questions/10782081
复制相似问题