理解函数

数学上的函数:

设A和B是两个非空集合,存在某种对应关系f,对于集合A中的任何一个元素a,在集合b中都存在唯一的一个元素b与之对应。这个对应关系就是函数
划重点:

  • 对应关系:指某种数学运算
  • 唯一性:同一个元素a,函数值是唯一的

程序上的函数:

一个代码片段,将输入的数据通过计算转成输出的数据。函数同样可以表示成y=f(x),x表示输入数据,也就是状态,y表示函数的输出结果。所有x组成的集合叫状态空间。类比于数学上的函数,函数应当有以下特点:
唯一性:同一个状态x,函数值是唯一的
这就要求我们尽可能将函数设计成跟环境无关的,只跟状态相关。

1
2
3
4
int c = 10;
int f(int x) {
return x +c;
}

这个是环境相关代码,变量c随时可以被改变,实际上,这个函数应该改成

1
2
3
int f(int x, int c) {
return x + c;
}

这个函数写法跟环境无关。但是,在实际代码实现中,有时候为了实现起来方便,或者函数输出后续复杂度的问题,会将输出写在参数列表中

1
2
3
void f(int x, Output output) {
output.print(x + 1);
}

这种写法需要仔细分析是否是一个环境无关的函数。

  • 状态:x
  • 函数值:x + 1
  • 输出:output.print(x + 1)

函数值是环境无关的,就看输出是否output.print是否环境无关
(先前有人写了个记忆化搜索,写得很混乱,没有分析好函数的状态和状态值,在记忆化搜索中少写了一个状态,导致函数值不是唯一)
数据计算领域中,提倡函数式编程,这是因为函数式编程的思想,将函数设计成跟环境无关,这种函数天然支持并行计算,不会出现环境不同,而导致的计算结果不同。