数学中的函数和编程中的函数有什么关系?
其实还是有区别的,编程中的函数,称之为方法,更为合适。
数学中的函数,代表的是一组关系。
编程的函数,更多的时候,代表的是解决一个问题的方法。
自变数是参数 因变数是返回值
编程中的函数和数学的函数是一样的,即将每一输入元素映射到输出元素的一种关系。
Lua本身有函数式编程的元素,如果你有兴趣以后可以学习一些函数式编程语言,如Haskell或Scala,在这种编程思维下,所有的电脑运算都看作函数。
较传统的指令式编程将程序看作是一条条指令执行的集合体,函数式编程则将程序看作是输入和输出之间的映射关系。其基础 验算本身就是一个严格的数学概念。
函数式编程有几个优点:
- 有完备的数学基础,更容易理解其逻辑
- 测试更容易,而且不太容易出错
- 非常强大,可以简单实现高度抽象化
- 和平行计算等概念很兼容
因为这些优点,即使不是函数式编程语言最近也有越来越偏向于函数式的趋势,例如Java从7到8就增加了大量函数式功能。
函数式编程有一些表面的缺点,
- 门槛高,感觉难学,这其实主要因为很多人在学校最早接触的编程都是指令式的
- 性能差,这主要因为早期函数编程没有专门相应的数据结构,使用一般指令式编程的数据结构会导致性能变慢
数学上的函数,是固定的参数对应固定的函数值,中间过程不会产生副作用,即不改变任何参数的状态。
而编程上的函数(方法),很多时候是为了完成某些功能,中间过程可以修改某些参数或外部变数的状态,(可能)最后顺便返回一个函数值。
类似数学上的意义,在编程中如果完全不修改变数的状态,固定的参数对应固定的函数值,这时的函数(方法)会被称为纯函数以作强调。
如果简单粗暴一点来回答的话,我猜测对于你现在的学习阶段,不妨把(无论是编程还是数学中的)函数想像成一个微波炉:你放进去一点东西,它做了一下处理,等你取出来的时候可能就变成新的东西了。比如面包变成了烤面包,鸡腿变成了烤鸡腿,等等。这个微波炉就是函数。
编程和数学里面也类似,比如把平方函数可以把2变成4,3变成9;加五函数可以把0变成5,-3变成2,等等。
其实无论是在数学还是编程中,「函数」这个词都有一定的模糊性。
例如在编程里面,过程、方法、(纯)函数都可以被称为函数,而且它们之间也确确实实有不少相似/关之处。
类似的,在数学中,尤其是中学老师们,常常把函数、方程、甚至曲线这几个术语混用。
所以,如果你能提供更多的信息,比如课本里面函数的截图,也许能更好地帮助大家理解你的困惑。
PS:才初二就玩lua这种语言了,后生可畏啊!
我感觉这俩的区别大于相似,关系有些错综复杂不太好叙述。
先说二者的区别吧,根据平时写代码的经验,函数是允许死循环的发生的(毕竟不报错,也没有警告),甚至有些程序是依赖死循环才能正常运行(比如操作系统)。但在数学上,函数绝对不存在死循环这个玩意,函数值要么存在要么不存在,没有卡死循环算不出来这回事。
对于不存在死循环的编程中的函数(好tm别扭),似乎一般称为演算法。演算法在有些定义中是采用数学上的函数来构造的,定义如下(写个大概,书不在手边,详细的参见《计算机程序设计艺术》1.1节,同时书中用这个方法构造了求最大公约数的演算法作为实例):
定义一个四元组 ,其中 是状态集, 都是 的一个子集,分别称为输入集和输出集,且 不能是空集。 是 的映射,且对于 中的任意一个元素 有 。
现定义一个序列 ,其中 , 。如果存在一个整数 使得 时有 ,则四元组 称为一个演算法。序列 可以看作是演算法在以 为输入时的运行步骤。
上面那两段文字中,第二段明显是为了限制演算法不能出现死循环,因此要限制在有限步骤之内演算法的输出必须稳定下来。那么去除相关的限制,似乎就可以得到计算机中演算法的相关定义,从这个角度就能看出二者之间的关联了。
数学中的函数虽然是一个映射,看起来是个动词,但实际上是个静态的玩意,在集合论当中有时直接把函数定义为一种二元关系, 实际上只是表明 和 之间有一个确定的关系 ,是个陈述句。
编程中的函数更加倾向于动作,对于一个确定的输入要有一步一步的过程来慢慢接近最终的输出,当这个过程长度为无穷时,程序就陷入了死循环。构造输出的单个步骤是可以用数学中的函数来描述的。
顺道一提,在数学上有个概念似乎可以直接对应到编程中的函数上,那就是lambda表达式。这玩意属于可计算理论上的东西,它的定义似乎完全不需要使用函数这个概念。用它可以直接写出真正意义上的计算机代码,但要写出这种代码需要很复杂的构造,所以这里就不叙述了。(其实根本原因是我也只会基础的部分)
再顺道一提,lambda演算是计算机理论的开端之一,现在很多编程语言都引入了它的思想,有各种各样的lambda表达式语法,是各个语言实现函数式编程的基础,我看到有些回答似乎提到了它。
数学函数必须有参数,必须有返回值,而且返回值和参数必须是映射关系,计算机函数不遵循这个
初学阶段,能具体的就不要抽象。刚开始的时候不要试图从很高的层面来对比两者(映射关系)。简单理解,两者没什么关系。不要试图从哲学层面来理解这些工程问题。切记。
本质上说一回事。你就按编程中的函数理解就可以。
只不过数学用的符号和写法与编程不同。
编程中翻译成方法比较妥当
我觉得,数学里的函数和编程语言里的静态函数(方法)是相同的。
推荐阅读: