mathematica实现闭包
2011-06-30 22:39
141 查看
犀利的问题与犀利的解答
参考来源:http://www.douban.com/group/topic/20803452/?start=0&post=ok#last
add[5]返回5,
add[10]返回15,
add[3]返回18,一直累加下去
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[]里的局部变量。
.
至此,整段程序的原理一目了然了。
参考来源: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[]里的局部变量。
.
至此,整段程序的原理一目了然了。
相关文章推荐
- iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包,swift 3.0
- js 使用闭包实现单例
- Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值
- js闭包的用途(匿名自执行函数,缓存,实现封装,实现面向对象)
- Swift利用闭包(closure)来实现传值-->前后两个控制器的反向传值
- javascript实现的闭包简单实例
- Lua 5.0实现 4 函数和闭包
- JavaScript setTimeout使用闭包功能实现定时打印数值
- Python闭包实现计数器的方法
- C#函数式程序设计之用闭包封装数据的实现代码
- 闭包方式实现全选
- jQuery基于闭包实现的显示与隐藏div功能示例
- js闭包实现私有变量和单例模式
- 闭包(Closure)详解及Javascript静态变量实现分析
- 用js闭包的方法实现多点标注冒泡示例
- 用闭包实现高级排他
- python 闭包与装饰器的实现
- .NET:C# 如何实现的闭包?
- JS实现动画原理一(闭包方式)
- python源码阅读-闭包实现