iterate
takes a function f
and an initial value x
and produces a lazy sequence. The first element in the seq is x
. Each subsequent element is computed by calling f
with the previous element.
Example 1:
(iterate (partial + 2) 0)
This generates a sequence, starting at 0, where each element is the previous element with 2 added to it. I.e.:
0
(+ 2 0) ; => 2
(+ 2 2) ; => 4
(+ 2 4) ; => 6
; etc
Each element in the seq is passed to (partial + 2)
when generating the following element.
Example 2:
(iterate (partial * 2) 1)
This generates a sequence, starting at 1, where each element is the previous element multiplied by 2. I.e.:
1
(* 2 1) ; => 2
(* 2 2) ; => 4
(* 2 4) ; => 8
(* 2 8) ; => 16
; etc
Again, you can see how each element feeds into the generation of the next one.
Example 3:
(iterate (fn [[a b]] [b (+ a b)]) [1 1])
Firstly, (fn [[a b]] ...)
is a way to destructure a value into parts. In this case, the function accepts a two-element vector and unpacks it into the local variables a
and b
.
The function returns a two-element vector containing b
and the sum of a
and b
(i.e. the second value in the previous pair and the sum of both values in the previous pair).
With this in mind, this iterate
call generates:
[1 1]
[1 (+ 1 1)] ; => [1 2]
[2 (+ 1 2)] ; => [2 3]
[3 (+ 2 3)] ; => [3 5]
[5 (+ 3 5)] ; => [5 8]
; etc
Then (map first ...)
grabs the first value in each pair, which gives you your Fibonacci sequence.