zoukankan      html  css  js  c++  java
  • 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[]里的局部变量。

    .

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

  • 相关阅读:
    Qt发送事件与自定义事件
    Qt文本流和数据流
    Qt文件操作
    Qt 布局管理器
    Qt 标准对话框
    Qt 对话框QDailog及其类型
    Qt 对象间的父子关系
    Qt 信号与槽
    Qt 计算器界面实现
    C++ 多态、虚函数(virtual 关键字)、静态联编、动态联编
  • 原文地址:https://www.cnblogs.com/dabaopku/p/2095076.html
Copyright © 2011-2022 走看看