使用 C 语言进行函数式编程
介绍
学习编程和学习编程语言并不相同。我们的大多数教科书都教我们编程语言。事实上,编程语言只是我们用来实现可执行程序的工具。我们需要教我们如何用编程语言解决问题的资源。
早在小学时,我们就学习过什么是数学函数,以及如何写出它。例如,f(x)=x^2是一个简单的二次函数。
函数描述了一个数学陈述。上面的函数映射了两组自然数之间的关系,如下图右侧所示。通常,当任一集合中都有大量离散元素时,不可能以图形方式显示这种映射。因此,为方便起见,我们将函数写成集合之间的固有关系来表示。
当我们处理数字集(整数、自然数、实数、复数等)时,这可能是展示关系的最简单的方法。
我们还可以将函数视为一台机器,它接收输入并使用映射输入和输出关系的机制产生输出。输入和输出所属的集合也很重要。函数通常有一个名称,以便我们识别它。通常,函数是确定性的,它只能从一组唯一的输入中产生一个输出。
哲学背景
利用不同的数学策略,我们可以解决不同领域的问题。
计算机编程的一个哲学基础是用一种语言来表示或表达所有类型的数学问题,并使用广义数学来解决它们。结果产生了两个等效系统,即图灵机和lambda 演算。
图灵机的概念影响了命令式编程范式,例如Assembly、C、C++、Java、Ruby、Python和其他编程语言。
另一方面,lambda 演算影响了LISP、ML、Haskell和Erlang等几种函数式语言的诞生。
尽管使用这些编程语言我们可以解决的问题比使用高中数学要多得多,但通过先解决较小的问题,学习编程通常更容易。在这本书(或小册子)中,我们将学习如何解决已知类别的问题。一开始,我们将看到如何将简单的算术函数转换为计算机程序。稍后,我们将学习如何转换更复杂的函数。我们还将学习如何使用其他函数组成一个函数。函数也可以通过递归使用其自身构建。我们将看到如何使用通常的模式匹配进行转换。
我们不会学习外星文字,而是尝试使用常识、简单的智商和模式匹配将数学函数转换为计算机程序。虽然我们将用C语言编写所有代码,但可以使用任何其他语言代替。如果我们使用其他语言,我们可能需要将给定的程序转换为该目标语言。所以,如果我们不懂任何其他语言,最好坚持使用C。
无论如何,本书中我们不会将转换后的代码编码(在计算机中编写代码以物理执行) ,而是尝试通过独立记下程序来学习程序。最初,这里给出的大多数问题都很小,可以用钢笔或铅笔轻松写在笔记本(纸)上。通过这种方式,学习者熟悉理论公式与实施程序之间的关系。
一元算术函数程序
本节中,我们将把一些基本函数转换为程序。首先,我们将了解如何编写一元函数的程序。稍后,我们将学习二元和 n 元函数的程序。
身份函数
恒等函数(或输出反映输入的函数)如下所示:
函数id(x) = x可以转换为:
int id(int x){
return x;
}
后继函数
后继函数使用+运算符将输入加1并返回其后继。
操作员 | 姓名 |
---|---|
+ | 添加 |
- | 减法 |
* | 乘法 |
/ | 分配 |
% | 提醒 |
函数suc(x) = x + 1可以转换为:
int suc(int x){
return x + 1;
}
两次函数
在算术上,这定义为twice(x) = 2x 。
在 C 语言中,相同的函数采用下面的形式。
int twice(int x){
return 2 * x;
}
平方函数
该函数的算术定义为square(x) = x^2。
在 C 语言中,它采用下面的形式。
int square(int x){
return x * x;
}
这里我们给出了上述函数square的图形表示,其中参数x与自身相乘以产生并返回结果。
多项式函数
在算术中,该函数定义为:poly_1(x) = x^2 + 1
它可以转换成编程函数,如下所示:
int poly1(int x){
return x * x + 1;
}
在算术中,该函数定义为:poly2(x) = x^4 + x^2 + 1
它可以转换成编程函数,如下所示:
int poly2(int x){
return (x * x * x * x) + (x * x) + 1;
}
这可以简化:
sum_{i=1}^ni = n(n+1)/2
它可以转换成编程函数:
int sum(int n){
return n * (n + 1) / 2;
}
锻炼
将算术函数转换为编程函数:
f1(x) = x + 2$ $f2(x) = x^3$ $f3(x) = 2x^2 + 3
f4(x) = 3x^3 + 4x^2 + 7$ $_1(m) = m(m+1)(2m+1)/6
sumOfSquare_2(m) = m^3/3 + m^2/2 + m/6$ $_1(m) = (m(m+1)/2)^2
sumOfSquare_2(m) = m^4/4+m^3/2+m^2/4
(y)= y - 1
(z)= z / 2
二元函数程序
函数,例如算术中的“add”,可以定义为:add(x, y) = x + y
它可以转换成编程函数:
int add(int x, int y){
return x + y;
}
算术函数 – addSquare(x, y) = x^2 + 2xy + y^2
它可以转换成编程函数:
int addSquare(int x, int y){
return (x * x) + (2 * x * y) + (y * y);
}
比较
现在我们将解决确定两个数字中较大数字的问题。在这种情况下,我们将构造一个接受两个参数的函数,如果第一个参数大于第二个参数,它将返回1 ,否则返回0。为此,我们将引入一个新的运算符>。
如果a大于b ,则a > b为1或(含义为True ) 。否则为0(含义为False)。因此,我们的函数是 – isLarger(x, y) = x > y
对应的程序是:
操作员 | 姓名 |
---|---|
> | 大于 |
>= | 大于或等于 |
< | 小于 |
<= | 小于或等于 |
== | 等于 |
!= | 不等于 |
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~