其实还是有区别的,编程中的函数,称之为方法,更为合适。

数学中的函数,代表的是一组关系。

编程的函数,更多的时候,代表的是解决一个问题的方法。


自变数是参数 因变数是返回值


编程中的函数和数学的函数是一样的,即将每一输入元素映射到输出元素的一种关系。

Lua本身有函数式编程的元素,如果你有兴趣以后可以学习一些函数式编程语言,如Haskell或Scala,在这种编程思维下,所有的电脑运算都看作函数。

较传统的指令式编程将程序看作是一条条指令执行的集合体,函数式编程则将程序看作是输入和输出之间的映射关系。其基础 [公式] 验算本身就是一个严格的数学概念。

函数式编程有几个优点:

  • 有完备的数学基础,更容易理解其逻辑
  • 测试更容易,而且不太容易出错
  • 非常强大,可以简单实现高度抽象化
  • 和平行计算等概念很兼容

因为这些优点,即使不是函数式编程语言最近也有越来越偏向于函数式的趋势,例如Java从7到8就增加了大量函数式功能。

函数式编程有一些表面的缺点,

  • 门槛高,感觉难学,这其实主要因为很多人在学校最早接触的编程都是指令式的
  • 性能差,这主要因为早期函数编程没有专门相应的数据结构,使用一般指令式编程的数据结构会导致性能变慢


数学上的函数,是固定的参数对应固定的函数值,中间过程不会产生副作用,即不改变任何参数的状态。

而编程上的函数(方法),很多时候是为了完成某些功能,中间过程可以修改某些参数或外部变数的状态,(可能)最后顺便返回一个函数值。

类似数学上的意义,在编程中如果完全不修改变数的状态,固定的参数对应固定的函数值,这时的函数(方法)会被称为纯函数以作强调。


如果简单粗暴一点来回答的话,我猜测对于你现在的学习阶段,不妨把(无论是编程还是数学中的)函数想像成一个微波炉:你放进去一点东西,它做了一下处理,等你取出来的时候可能就变成新的东西了。比如面包变成了烤面包,鸡腿变成了烤鸡腿,等等。这个微波炉就是函数。

编程和数学里面也类似,比如把平方函数可以把2变成4,3变成9;加五函数可以把0变成5,-3变成2,等等。


其实无论是在数学还是编程中,「函数」这个词都有一定的模糊性。

例如在编程里面,过程、方法、(纯)函数都可以被称为函数,而且它们之间也确确实实有不少相似/关之处。

类似的,在数学中,尤其是中学老师们,常常把函数、方程、甚至曲线这几个术语混用。

所以,如果你能提供更多的信息,比如课本里面函数的截图,也许能更好地帮助大家理解你的困惑。

PS:才初二就玩lua这种语言了,后生可畏啊!


我感觉这俩的区别大于相似,关系有些错综复杂不太好叙述。

先说二者的区别吧,根据平时写代码的经验,函数是允许死循环的发生的(毕竟不报错,也没有警告),甚至有些程序是依赖死循环才能正常运行(比如操作系统)。但在数学上,函数绝对不存在死循环这个玩意,函数值要么存在要么不存在,没有卡死循环算不出来这回事。

对于不存在死循环的编程中的函数(好tm别扭),似乎一般称为演算法。演算法在有些定义中是采用数学上的函数来构造的,定义如下(写个大概,书不在手边,详细的参见《计算机程序设计艺术》1.1节,同时书中用这个方法构造了求最大公约数的演算法作为实例):

定义一个四元组 [公式] ,其中 [公式] 是状态集, [公式] 都是 [公式] 的一个子集,分别称为输入集和输出集,且 [公式] 不能是空集。 [公式][公式] 的映射,且对于 [公式] 中的任意一个元素 [公式][公式]

现定义一个序列 [公式] ,其中 [公式] , [公式] 。如果存在一个整数 [公式] 使得 [公式] 时有[公式] ,则四元组 [公式] 称为一个演算法。序列 [公式] 可以看作是演算法在以 [公式] 为输入时的运行步骤。

上面那两段文字中,第二段明显是为了限制演算法不能出现死循环,因此要限制在有限步骤之内演算法的输出必须稳定下来。那么去除相关的限制,似乎就可以得到计算机中演算法的相关定义,从这个角度就能看出二者之间的关联了。

数学中的函数虽然是一个映射,看起来是个动词,但实际上是个静态的玩意,在集合论当中有时直接把函数定义为一种二元关系, [公式] 实际上只是表明 [公式][公式] 之间有一个确定的关系 [公式] ,是个陈述句。

编程中的函数更加倾向于动作,对于一个确定的输入要有一步一步的过程来慢慢接近最终的输出,当这个过程长度为无穷时,程序就陷入了死循环。构造输出的单个步骤是可以用数学中的函数来描述的。

顺道一提,在数学上有个概念似乎可以直接对应到编程中的函数上,那就是lambda表达式。这玩意属于可计算理论上的东西,它的定义似乎完全不需要使用函数这个概念。用它可以直接写出真正意义上的计算机代码,但要写出这种代码需要很复杂的构造,所以这里就不叙述了。(其实根本原因是我也只会基础的部分)

再顺道一提,lambda演算是计算机理论的开端之一,现在很多编程语言都引入了它的思想,有各种各样的lambda表达式语法,是各个语言实现函数式编程的基础,我看到有些回答似乎提到了它。


数学函数必须有参数,必须有返回值,而且返回值和参数必须是映射关系,计算机函数不遵循这个


初学阶段,能具体的就不要抽象。刚开始的时候不要试图从很高的层面来对比两者(映射关系)。简单理解,两者没什么关系。不要试图从哲学层面来理解这些工程问题。切记。


本质上说一回事。你就按编程中的函数理解就可以。

只不过数学用的符号和写法与编程不同。


编程中翻译成方法比较妥当


我觉得,数学里的函数和编程语言里的静态函数(方法)是相同的。


推荐阅读:
相关文章