(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 中完全实现了定点 sqrt 方法:http: //jsfiddle.net/tXDQL/。