在clojure中,如何使用迭代函数构建惰性序列

在clojure中,如何使用迭代函数构建惰性序列,clojure,Clojure,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) 有人能更详细地解释clojure迭代函数的语法吗?我对所有的用法都很困惑。为什么在(fn[[a

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)
有人能更详细地解释clojure迭代函数的语法吗?我对所有的用法都很困惑。为什么在(fn[[a b]][b(+a b)]中有两个括号

另一个例子是:


iterate
接受一个函数
f
和一个初始值
x
,并生成一个延迟序列。序列中的第一个元素是
x
。通过调用前一个元素的
f
来计算每个后续元素

示例1:

(iterate (partial + 2) 0)
(iterate (partial * 2) 1)
(iterate (fn [[a b]] [b (+ a b)]) [1 1])
这将生成一个从0开始的序列,其中每个元素都是前一个添加了2的元素。即:

0
(+ 2 0) ; => 2
(+ 2 2) ; => 4
(+ 2 4) ; => 6
; etc
生成以下元素时,seq中的每个元素都会传递给
(部分+2)

示例2:

(iterate (partial + 2) 0)
(iterate (partial * 2) 1)
(iterate (fn [[a b]] [b (+ a b)]) [1 1])
这将生成一个从1开始的序列,其中每个元素都是前一个元素乘以2。即:

1
(* 2 1) ; => 2
(* 2 2) ; => 4
(* 2 4) ; => 8
(* 2 8) ; => 16
; etc
同样,您可以看到每个元素是如何进入下一个元素的生成的

示例3:

(iterate (partial + 2) 0)
(iterate (partial * 2) 1)
(iterate (fn [[a b]] [b (+ a b)]) [1 1])
首先,
(fn[[ab]]…)
是一种将值转换为部分的方法。在这种情况下,函数接受一个两元素向量,并将其解压为局部变量
a
b

该函数返回一个两元素向量,其中包含
b
a
b
的和(即前一对中的第二个值和前一对中两个值的和)

记住这一点,此
迭代调用将生成:

[1 1]
[1 (+ 1 1)] ; => [1 2]
[2 (+ 1 2)] ; => [2 3]
[3 (+ 2 3)] ; => [3 5]
[5 (+ 3 5)] ; => [5 8]
; etc

然后
(首先映射…
获取每对中的第一个值,这将为您提供斐波那契序列。

非常感谢~这太棒了!