曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 2735|回复: 0
打印 上一主题 下一主题

匿名函数与高阶函数

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2014-11-22 11:57:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个函数接受另一个函数作为实参的,称其是一个 “高阶函数” (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() 打印出了基本相等的


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-28 19:09 , Processed in 0.072370 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表