函数式循环
-
while
-
loop/recur
Clojure没有传统的for循环,程序可以通过使用高阶函数实现类似的行为
Clojure版本的循环流程使用loop和recur
- 上图定义了一个函数fact-loop
- 传入参数n
- 然后loop循环
- 首先通过let形式,将n绑定到current,将1绑定到fact
- 之后通过if判断current是否等于1
- 等于1则返回fact
- 如果不等于1,则执行recur
- 调用dec,将current减1,计算current乘以fact,并将这两个值重新与current和fact绑定
- 接着再执行if形式,直到满足if条件导致不再调用recur,循环结束
recur只能用于代码尾部,否则会报错
-
doseq和dotimes
-
map
map函数与数据结构中的“映射”不同,最简单的用法接收一个一元函数和一个数据序列,map将函数运用到序列的每一个元素
普遍用法:接收一个函数,取得任意数量的参数和相同数量的序列,多个序列不相等,应用到最短的序列
-
filter和remove
filter接收一个判定函数和一个序列,返回判定函数逻辑真值的序列元素
remove与filter刚好相反
-
reduce
reduce接收一个函数(有两个参数)和一个数据元素序列
函数参数应用到序列的前两个元素,产生第一个结果,然后利用这个结果和序列的下一个元素再次调用这个函数,重复这个过程直至处理完最后一个元素
上图的最后一个函数,定义了用来处理指定数字的阶乘reductions函数输出了每一步的结果组成的序列