clojure 文档给出了以下示例:
(take 10 (iterate (partial + 2) 0))
(def powers-of-two (iterate (partial * 2) 1))
(take 10 powers-of-two)
(def fib (map first (iterate (fn [[a b]] [b (+ a b)]) [1 1])))
(take 10 fib)
Run Code Online (Sandbox Code Playgroud)
任何人都可以更详细地解释clojure的迭代函数的语法?我对所有用法都非常困惑.为什么有两个括号(fn [[ab]] [b(+ ab)])?
另一个例子可以在这里找到:
(defn iter [[x y]]
(vector y (+ x y)))
(nth (iterate iter [0 1]) 10000)
Run Code Online (Sandbox Code Playgroud)
har*_*rto 15
iterate获取函数f和初始值x并生成惰性序列.seq中的第一个元素是x.通过f使用前一个元素调用来计算每个后续元素.
例1:
(iterate (partial + 2) 0)
Run Code Online (Sandbox Code Playgroud)
这将生成一个序列,从0开始,其中每个元素都是前一个元素,并添加了2个元素.即:
0
(+ 2 0) ; => 2
(+ 2 2) ; => 4
(+ 2 4) ; => 6
; etc
Run Code Online (Sandbox Code Playgroud)
(partial + 2)生成以下元素时,seq中的每个元素都会被传递给它们.
例2:
(iterate (partial * 2) 1)
Run Code Online (Sandbox Code Playgroud)
这将生成一个序列,从1开始,其中每个元素是前一个元素乘以2.即:
1
(* 2 1) ; => 2
(* 2 2) ; => 4
(* 2 4) ; => 8
(* 2 8) ; => 16
; etc
Run Code Online (Sandbox Code Playgroud)
同样,您可以看到每个元素如何进入下一个元素的生成.
例3:
(iterate (fn [[a b]] [b (+ a b)]) [1 1])
Run Code Online (Sandbox Code Playgroud)
首先,(fn [[a b]] ...)是一种方法,解构一个值的部分.在这种情况下,函数接受一个双元素向量并将其解包到局部变量a和b.
该函数返回一个包含两个元素的矢量b和的总和a与b(即,在前面的一对所述第二值和这两个值的在前面的一对之和).
考虑到这一点,此iterate调用生成:
[1 1]
[1 (+ 1 1)] ; => [1 2]
[2 (+ 1 2)] ; => [2 3]
[3 (+ 2 3)] ; => [3 5]
[5 (+ 3 5)] ; => [5 8]
; etc
Run Code Online (Sandbox Code Playgroud)
然后(map first ...)抓住每对中的第一个值,这将为您提供斐波纳契数列.
| 归档时间: |
|
| 查看次数: |
2920 次 |
| 最近记录: |