什么是函数式编程
常见的编程方法有命令式编程、函数式编程等,面向对象编程就是命令式编程,通过图灵机实现,将命令写在纸条上,一条条执行,即下一步要执行什么,都要在纸条上将命令写好。
而函数式编程就是不需要管运算过程,直接是函数式的映射,就像数学函数一样,函数值只与变量有关。
即函数式编程只关心数据之间的映射,而命令式编程关心问题解决的步骤
函数式编程的特点:
不可变性:变量是不可变的
函数式编程就是一个表达式
函数式编程不是冯诺依曼体系结构的,是通过λ演算进行的
函数式编程的好处:
函数式编程的好处是由不可变性带来的:
(1)函数不依赖外部状态,也不改变外部状态,函数的结果也不会依赖调用的时间和位置,这样写的代码容易推理,不易出错。也方便做单元测试
(2)多个线程之间不会共享状态,就不会造成资源争用,就不需要锁来保护可变状态,就不会造成死锁,可以更好的并发。
个人理解:
函数式编程就和递归、动态规划有点像,你只管告诉机器做什么,而不用管里面的具体实现步骤(即怎么做)。
案例:
假设某国家有若干种面值的货币coins:List[Int],现在需要用一张货币money换成零钱,问有多少种换法?
def countChange(money:Int,coins:List[Int]): Int ={
if (money == 0)
1
else if(money < 0 || coins.isEmpty)
0
else
countChange(money,coins.tail) + countChange(money - coins.head,coins)
}
其中coins.tail和coins.head是scala语法集合中的用法:
tail是取集合除了第一个元素之外的所有元素
head是取集合的第一个元素
countChange(money,coins.tail)就是money不变;coins变
countChange(money - coins.head,coins)就是money变,coins不变
两者相加;
所以只用告诉机器做什么,不用管他的具体实现步骤,怎么做
函数是语言的其它特性:
高阶函数、偏应用函数、柯里化、闭包
高阶函数:就是表达式中的变量也为函数或者返回值也为函数,有了高阶函数,就可以将复用的粒度降到函数级别
函数式编程语言也提供惰性求值:将表达式赋值给变量时,表达式不会进行计算,只有当引用到变量时,表达式才会计算,可以减少不必要的计算来提高性能。
