mathematica实现闭包

犀利的问题与犀利的解答

参考来源:http://www.douban.com/group/topic/20803452/?start=0&post=ok#last

问题

定义一个函数add[x],每次调用可以将参数累加,例如: 
add[5]返回5, 
add[10]返回15, 
add[3]返回18,一直累加下去

解答

add = Module[{y}, y = 0; Function[x, y = y + x]] 

add[3]

add[5]

add[3]

分析

以上问题是要实现闭包的概念。

闭包是只有在允许函数嵌套的语言中才存在的现象,英文名是Closure,c++中自然是没有的,当然可以把static变量理解成一定意义上的闭包。

这篇文章http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 从javascript角度详细阐述了闭包的概念,可以参考。

我们来分析一下上面的代码:

首先是要了解Module的机制。Module中定义的变量y,是一个“局部变量”,但是mathematica中是没有局部变量的概念的,因此Mathematica是通过创建一个匿名的临时变量来模拟局部变量的效果,具体请参考帮助 tutorial/HowModulesWork

因此,在上述Module中,y实际上被定义成了 y$345(345是个随机数,依赖于你工作到现在用过多少临时变量了)

.

其次,需要注意的,是这里的add和Module的关系。要注意,这里的add并不是Module定义的这一段过程,而是Module这段过程的结果。也就是说,add是这个Module的返回值,而不是Module本身。

.

因此,你可以这么理解这段程序

f[] := Module[{y}, y = 0; Function[x, y = y + x]]

add = f[]

所以说,y=0的赋值总共只被执行了一次

而add相当于上面f[]的一个闭包,每次调用add函数就更新了y的值,相当于访问了f[]里的局部变量。

.

至此,整段程序的原理一目了然了。

posted on   大宝pku  阅读(1041)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

导航

< 2011年6月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 1 2
3 4 5 6 7 8 9
点击右上角即可分享
微信分享提示