什么是函数式编程
    常见的编程方法有命令式编程、函数式编程等,面向对象编程就是命令式编程,通过图灵机实现,将命令写在纸条上,一条条执行,即下一步要执行什么,都要在纸条上将命令写好。
    而函数式编程就是不需要管运算过程,直接是函数式的映射,就像数学函数一样,函数值只与变量有关。
    即函数式编程只关心数据之间的映射,而命令式编程关心问题解决的步骤

    函数式编程的特点:
    不可变性:变量是不可变的
    函数式编程就是一个表达式
    函数式编程不是冯诺依曼体系结构的,是通过λ演算进行的
    函数式编程的好处:
    函数式编程的好处是由不可变性带来的:
    (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不变
    两者相加;
    所以只用告诉机器做什么,不用管他的具体实现步骤,怎么做

    函数是语言的其它特性:
    高阶函数、偏应用函数、柯里化、闭包
    高阶函数:就是表达式中的变量也为函数或者返回值也为函数,有了高阶函数,就可以将复用的粒度降到函数级别
    函数式编程语言也提供惰性求值:将表达式赋值给变量时,表达式不会进行计算,只有当引用到变量时,表达式才会计算,可以减少不必要的计算来提高性能。