计算机函数和数学函数有哪些区别和关系?

如题所述

计算机函数和数学函数都是 函数 。如果抽象地来说函数的意思就是一个 输入 产生一个 输出 ,那么这个输出就是输入的 函数 。输入和输出之间的这种关系叫做 函数映射 。

上图:函数的基本定义示意


不管是计算机函数,还是数学函数,它们都符合函数的这个抽象定义。

上图:这是函数,因为不同的输入值有唯一的输出值。

上图:这不是函数,因为相同的输入值对应了不同的输出值。


换一种你可能觉得匪夷所思的方式来描述函数,可以这么来讲:

函数实际上是一个 两两有序配对 的集合,一个X值 仅 对应一个Y值,但一个Y值 不一定 对应一个X值。这个X与Y值的配对的集合G就是 函数的图 ,如果用坐标系表示就是我们经常看到的那种函数曲线图。

上图:一个典型的函数曲线图。


从形式上讲,函数图和函数是相同的东西,但函数图隐藏了函数作为某种 过程 的内涵。因此,在通常的用法中,函数和函数图是区分开来讲的。

此外,函数也称为 映射 ,虽然“映射”和“函数”之间还是有一些差别。


函数的基本定义是数学的函数和计算机函数通用的,否则就不叫函数。下面我们分开看下数学函数和计算机函数的异同。


函数最早就是在数学领域定义的,因此数学的函数的定义基本上与上面讲的函数的基本定义类似,但是数学的函数限定函数的输入和输出对象必须是数,而不是其它什么猫猫狗狗。

你不能说我有一个函数: f(x),然后当x=猫,算出来f(x)=狗。

这样的函数在数学上不成立的,其根本原因在于数学的运算只能适用于数,这里的x代表的是一个数,只能从数的集合当中选取。

如果我们把上面的例子再复杂一下,例如:

函数f(x)=2x+1;但你要让我算 当x=猫 时的函数值,那我最多可以代数推理到这一步:

f(x)=2猫+1,但是2x猫是什么含义,2猫能跟+1运算吗?显然不行,这哪里哪呀?完全是牛头不对马嘴。

所以,数学的函数,限定了函数的取值范围是“数”!

这和计算机的函数就有了差别。


计算机也是建立在数学的原理之上,从计算机的本质上讲, 计算机就可以被视为一种函数 ——一种物理实现的函数,它有输入,有输出。至少从物理原理上讲, 它是以电脉冲信号作为输入,并输出电脉冲信号 。而且计算机确保了函数的一个最基本特征,即 有序对应 (或者说映射),相同的输入对应相同的输出,绝对不能出现相同的输入居然产生不同的输出的情况。所以,计算机本身就具备了函数的某些特质。

上图:计算机的基本功能是不是跟我们前面对函数的基础定义的图示有些相似?


抛开计算机的物理硬件属性(硬件部分)来说,单看计算机的逻辑属性(即软件部分),也就是基于计算机的运作方式而保证成立的那套 运作机制, 恰恰就是数学函数。计算机的软件部分 可以完全被视为纯粹的函数 ,这一点问题都没有,因为计算机的软件体系完全符合函数的基本定义。


只不过,计算机软件设计人员利用 计算机高级编程语言 的设计思路,将 数学函数 的原理和描述方式引入到了 计算机的设计 和 计算机的编程开发 当中。并且将复杂的概念建立在了数学函数的基础上,实现了计算机最重要的 操作 和 行为 概念(我们用计算机可不是仅仅用来做算数)。这更强调了之前函数的通用定义当中关于 函数是一个“过程”的内涵。

计算机的编程语言不是给计算机看的,而是给程序员看的,是方便程序员自己知道自己想让计算机执行什么指令。虽然程序员输入的是一些程序代码,但实际上这些程序代码最终会被编译为数(包括指令和数据等等)。

上图:程序的流程图:大量函数相互连接就构成了复杂的逻辑操作体系。


但实际上计算机的 操作和行为 ,最终落到计算机的硬件底层都是建立在数字信号的基础上的,这种 操作和行为 实际上就是大量函数的宏观集合——通过运算实现对现实世界的 反映和反馈 。


举几个典型的此类操作的例子,看看它们是如何由函数构成的:

上图:内存的寻址就是一种典型的数值控制的操作,一串10的组合决定了应该从内存当中的哪一块提取数据。所以像内存这个设备输入数值,即可获取另一串输出的数值。内存也是一个函数。


上面是从计算机的底层机制来说的,也就是说 计算机的底层完全是基于函数的,所谓的计算和操作一切都是函数。


上图:高级语言(人可读的指令)是如何变成CPU可读的指令,一切都会落到01构成的数值上,作为CPU的输入得到处理。这些数值不仅提供了x,也提供了f,应该说是高层的f,意思是处理数据的方法。高层的f会被变成底层的f,从而会被CPU执行(实际上CPU只知道少量的固定的底层的f)。


而对于计算机编程语言当中的函数来说,函数就具备了更高层次的含义。诸如一个C语言的函数,或者java语言的函数……

这些函数在另一个层面上体现了一些与数学上函数的不同。由于计算机高级语言品种非常多,我这里也就不过多展开,只说一点点抽象的共性:

在高级编程语言当中,函数和过程(routine)具有类似的含义或者本质,这是对函数"过程"含义的强化, 也就是前面我们提到的那个f()的含义 。


通过函数集合的宏观化,函数就变成了 “宏”(macro) ——一种具有动作属性的整体概念,即操作。读到这里,读者应该可以联想到为什么excel里面的VBA程序会被称为“宏”。

实际上 宏就是一种动作,或者操作 的集合,其目的不是给出输出的数值,而是给出一系列动作。但归根就底,宏也是建立在堆叠的函数的基础上的,是一个封装的整体概念,它不过是强调了函数的过程属性而已。

上图:Excel中基于VBA的宏程序示例


小结一下:

计算机由于具备了强大的计算能力,于是可以高效地处理大量的函数,因此在此基础上,人类使得计算机的软件体系形成了“操作”的概念,因为我们不仅仅是想要计算机通过复杂的函数计算告诉我们一个最终值,而是需要计算机通过计算出来的大量的值去做一些事情。这是将计算力变成生产力的关键。但不管操作也好、宏也好、其微观都是建立在单个简单的函数的基础上的,其原理也是建立在数学函数的概念之上的,输入-过程-输出的映射是计算机的基本原理。当硬件确保了这种基本原理的稳态运作,就成了计算机。即便用这样的定义去衡量中国人发明的算盘也是一样的道理。



数学上函数的概念是计算机函数概念的微观原理基础。计算机发展到高级阶段之后,计算机函数的含义 更多地强调了函数的过程特性 ,从而形成了强大的操作能力,虽然这种操作能力最终是由硬件来实现的。但无论怎么发展,计算机函数的内涵都是符合数学函数的内涵的。

这个我之前恰好写过一篇文章,讨论了这个问题。下面摘录一部分:


在数学中有各种各样的数学函数,比如 sin ln 等函数,sin(pi/2)=1,ln1 = 0 等等。

在 C 语言中,我们当然也可以使用这些函数,请看如下代码:

math.h 中包含各种数学函数的目录,只要将其用 #include 导入,在 main 中使用 sin,log 函数时,程序才知道从哪里找这些函数。我们在 codeblocks 中执行它,输出如下:

在数学中,使用函数时可以省略括号,例如 sin pi/2,而 C 语言中的函数则一定要使用 (),例如 sin(pi/2)。在C语言的术语中,pi/2是参数,sin是函数,使用 sin(pi/2) 就是程序员常说的“函数调用”。

事实上,printf(“…”,…); 也是一种函数调用。但是 printf 感觉不像一个数学函数,为什么呢?因为像 sin 这种函数,传递一个参数给它,它会返回给我们一个计算后的值,我们调用 sin 函数就是为了得到它的返回值。至于 printf 函数,我们并不关心它的返回值,更关心的是它的“副作用”(计算返回值的过程中,往控制台打印的字符。)。事实上,printf 也有返回值,它返回的是实际打印的字符数。

计算机中的函数function,和数学中的函数,既有类似也有区别。

数学中的函数,就是从输入到输出的映射,比如 y = f(x)。

计算机中的函数,有的时候是映射,比如c语言数学库里的各种函数,cos(x),sin(x)等,或者字符串处理的函数,比如计算字符串长度 strlen(s),拼接字符串 strcat(str1, str2),等等,对应输入,有一个输出。

有的时候,计算机中的函数表示一个action的序列,比如画一条直线 draw_line(p1, p2),根据输入执行一系列动作;关闭 shutdown(),没有输入,直接执行动作。

而数学中的函数就没有这样的功能。


实际上,有的编程语言中,对这两种情况做了区分,表示映射的叫做 function ,表示动作的,叫做 procedure

两种函数都有相似的地方,就是好像一个黑箱,送人一个或几个参数,黑箱的另一端出来了某种结果。但是,数学函数只有数学结果,计算机语言的函数可能有数学以外的结果,比如某种操作。因为,这种操作也符合黑箱的模型:输入-输出。

数学上的函数纯粹数学的,它本身就是一个实体。所以,可以对数学函数进行其他加工,比如求导、积分;多函数联立;函数的函数;函数集合等等。计算机函数,即使只是数学的函数,它也只有数值计算,不能当做实体然后再加工。

如果一开始,计算机函数用了另一个名字,比如暗盒,那么今天就不会有这样的疑问了,相反可能会问:计算机暗盒与生活中的暗盒有啥区别?

计算机函数是一个处理机,数学函数是一个映射

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网