`
king_tt
  • 浏览: 2115890 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Clojure 学习入门(14)—— 循环控制

 
阅读更多
Clojure 基于函数的流程控制
repeatedly 字面意思为重复函数。一般的用法如下:
  1. user=>(repeatedly5#(rand-int11))
  2. (68266)

重复产生5次随机数。rand-int 11表示0至11的随机数。

这里顺便提一下repeat函数:repeat函数接受一/两个常量参数,用法如下:
  1. user=>(repeat5(int(rand-int100)))
  2. (3030303030)
当repeat、repeatedly函数只接受一个参数时(即没有重复次数的参数),需要配合take来中止,否则会产生内存溢出的错误。如下:
  1. user=>(repeatedly#(rand-int11))
  2. OutOfMemoryErrorJavaheapspacejava.util.Arrays.copyOf(Arrays.java:2882)
  3. user=>(take5(repeatedly#(rand-int11)))
  4. (107028)

iterate:
迭代函数形式如下:
(iterate f v)
相当于:
while(true) { v = f(v) }
所以一般要配合(take n sequence)来中止:
  1. user=>(take10(iterateinc5));(567891011121314)
  2. user=>(take10(iterate#(+%5)5));(5101520253035404550)
  3. user=>(take10(iterate#(*%2)2));(2481632641282565121024)

基于序列的流程控制
dotimes 会执行给定的表达式一定次数, 一个本地binding会被给定值:从0到一个给定的数值。如下:
  1. user=>(dotimes[num3](println"number:"(incnum)))
  2. number:1
  3. number:2
  4. number:3
  5. nil

doseq和for的语法是一样的,只不过for返回lazy seq而doseq接受任意数量的表达式, 以有副作用的方式执行它们, 并且返回nil
  1. user=>(doseq[i(range10)](printlni))
  2. 0
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. 7
  10. 8
  11. 9
  12. nil
  13. user=>(doseq[i[123]j[1020]](printlni"-"j))
  14. 1-10
  15. 1-20
  16. 2-10
  17. 2-20
  18. 3-10
  19. 3-20
  20. nil

for、doseq都支持遍历多个集合(最右边的最快),同时还可以用:when 和 :while来过滤。
  1. user=>(for[x(range37)](*xx))
  2. (9162536)
  3. user=>(for[x[012345]:let[y(*x3)]:when(even?y)]y)
  4. (0612)

上面第二条语句可理解为:先定义x为集合,再使用let将y赋值为x*3,最后判断y是否为偶数,偶数才返回


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics