Logs

clojure functional programming

Clojure函数式编程 [toc] 函数 一等函数 函数在clj里面是一等公民;指的是函数可以被当做普通数据对待,具有以下特性: 可以按需创建 可以在数据结构中存储 可以当做函数实参 可以当做函数返回值 这此特性可以为程序提供更多的灵活性. 闭包 闭包指的是函数可以访问成员变量,一般需要函数A返回一个函数B,在返回函数B里持有函数A的成员变量,形成一个闭包。 也可以看做是函数定制的一种手段 (defn repeat-n [n] (fn [num] (* n num))) (def repeat-2 (repeat-n 2)) (repeat-2 5) ;;=> 10 尾递归 尾递归顾名思义,是指在函数尾部进行了递归调用. 与一般的递归区别于返回方式&资源释放. 一般递归需要依次返回,返回值是由首次调用函数返回的,资源需要返回后才能被释放.如递归调用函数A,A1调用A2最终返回值是由A2返回给A1,A1再返回给caller. 并且在A2执行时, A1的资源不会被释放.所以调用时要考虑递归层级问题,如果层级太深会发生堆栈溢出. 尾递归是在A2执行时,A1的资源会被释放,并且最终返回结果是由A2直接返回给caller.所以在调用时,不会出现溢出问题. jvm并不支持尾递 ;;一般递归 (defn pow [base exp] "计算base的exp次幂" (if (zero? exp) 1 (* base (pow base (dec exp)))) ) ;;尾递归版本(clojure版本) (defn pow (base exp) (letfn [(kapow [base exp sum] (if (zero? exp) sum (recure base