曲径通幽论坛

标题: 匿名函数与高阶函数 [打印本页]

作者: beyes    时间: 2014-11-22 11:57
标题: 匿名函数与高阶函数
一个函数接受另一个函数作为实参的,称其是一个 “高阶函数” (higher-order function)。

LUA 将函数视为 “第一类值”,高阶函数也不例外。所谓第一类值,就是说 LUA 中函数与其他传统类型的值具有相同的权利,如函数也可以存储到变量中(无论是全局变量还是局部变量)或 table 中,可以作为实参传递给其它函数,还尅作为其它函数的返回值。

下面是一个关于导数的高阶函数,一般来说,一个函数 f 在点 x 处的导数公式为 ( f(x+d) - f(x) ) / d ,其中 d 趋向于无限小,那么可以用如下方式来近似地计算这个函数 f 的导数:
  1. function derivative (f, delta)
  2.    delta = delta or 1e-4
  3.    return function (x)
  4.                return ( f(x + delta) - f(x) ) / delta
  5.              end
  6.    end
  7. c = derivative(math.sin)
  8. print (math.cos(10), c(10));
复制代码

运行输出:
-0.83907152907645 -0.83904432662041

首先说明一定,正弦函数 sin(x) 的导数是 cos(x),而 cos(x) 的导数是 -sin(x) 。

在上面程序中,语句 c = derivative(math.sin) ,将函数 math.sin 作为实参传递给 derivative() ,那么在 derivative() 内部则有 ( math.sin(x + delta) - f(x) ) / delta 。

接着,在 print() 中调用了 c(10) 。这里,10 将传递到 derivaive() 中匿名函数的参数 x 中。类似的,如果匿名函数有 2 个参数,那么就相应的可以从外头传递 2 个实参给它。

最后 print() 打印出了基本相等的







欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2