函数式编程心得
读了两天 SICP ,谈一谈我对函数式编程的认识。
函数式编程
每一种编程范式,与其说告诉我们能做什么,不如说告诉我们不能做什么。在函数式编程语言Scheme中:
- 函数没有副作用
- 没有指针
- 函数就是打包了的表达式
但这些都是外在的,函数式编程的最大感受是函数式与数学联系紧密。
程序片段对比
最大公约数
python
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
scheme
(define (gcd a b)
(if (= b 0)
a
(gcd b (remainder a b))))
python 代码描述了一个流程,当b不为零时,按规则变换a, b,最后返回a。流程非常清晰,但却没有反映语义层面的信息。再看 scheme 的代码,没有了循环流程控制了while
,用递归实现迭代,反而突出了语义信息。就算不理解gcd
的含义,我们也可以看出
g
c
d
(
a
,
b
)
=
g
c
d
(
b
,
a
m
o
d
b
)
gcd(a,b)=gcd(b,a\ mod\ b)
gcd(a,b)=gcd(b,a mod b),而这正是理解程序有效性的关键。
使用scheme,广泛使用递归,很不适应。以前,不到万不得已不用递归,喜欢简单的循环。但现在我对递归有了新的看法,它不只是“咬住自己尾巴的蛇”、“克莱因瓶”、“俄罗斯套娃”——一种可有可无的奇怪用法,而是蕴含程序设计分治思想、能运行的数学语言。