//过程风格的阶乘 int factorial (int n) { if (n <= 0) return 1; else return n * factorial (n-1); }
这类语言也叫做过程性 编程语言,因为它们定义了解决问题的过程。函数式编程与这个原理有显著不同。在函数式编程中,需要描述问题 “是什么”。函数式编程语言又叫做声明性语言。同样的计算阶乘的程序可以写成所有到 n 的数字的乘积。
//函数式风格的阶乘 factorial n, where n <= 0 := 1 factorial n := foldr * 1 take n [1..]
第二个语句指明要得到从 1 开始的前 n 个数字的列表(take n [1..]),然后找出它们的乘积,1 为基元。这个定义与前面的示例不同,没有循环或递归。它就像阶乘函数的算术定义。一旦了解了库函数(take 和 foldr)和标记(list notation [ ])的意义,编写代码就很容易,而且可读性也很好。
函数式编程具有五个鲜明的特点:
1. 函数是"第一等公民":指的是函数与其他数据类型一样,处于平等地位
2. 只用"表达式",不用"语句"
"表达式"(expression)是一个单纯的运算过程,总是有返回值;
"语句"(statement)是执行某种操作,没有返回值。
3. 没有"副作用"
指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
4. 不修改状态
变量往往用来保存"状态"(state)。不修改变量,意味着状态不能保存在变量中,函数式编程使用参数保存状态
5. 引用透明
指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的
// 阶乘的一般实现 (过程式编程) function factorial(n) { if (n == 1) { return 1; } else { return factorial(n - 1) * n; } } // 阶乘的函数式编程风格实现 function mul(a, b){ return a*b; } function dec(x){ return x - 1; } function equal(a, b){ return a==b; } function factorial(n) { if (equal(n, 1)) { return 1; } else { return mul(n, factorial(dec(n))); } }
原文:http://www.cnblogs.com/chenlogin/p/6372019.html