iterate
принимает функцию f
и начальное значение x
и создает ленивую последовательность.Первый элемент в seq - x
.Каждый последующий элемент вычисляется путем вызова f
с предыдущим элементом.
Пример 1:
(iterate (partial + 2) 0)
Это создает последовательность, начиная с 0, где каждыйЭлемент - это предыдущий элемент, к которому добавлено 2.Т.е.:
0
(+ 2 0) ; => 2
(+ 2 2) ; => 4
(+ 2 4) ; => 6
; etc
Каждый элемент в seq передается в (partial + 2)
при генерации следующего элемента.
Пример 2:
(iterate (partial * 2) 1)
Создается последовательность, начиная с 1, где каждый элемент - это предыдущий элемент, умноженный на 2. Т.е.:
1
(* 2 1) ; => 2
(* 2 2) ; => 4
(* 2 4) ; => 8
(* 2 8) ; => 16
; etc
Опять же, вы можете видеть, как каждый элемент влияет на генерацию следующего.
Пример 3:
(iterate (fn [[a b]] [b (+ a b)]) [1 1])
Во-первых, (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
Затем (map first ...)
получает первое значение в каждой паре, что дает вам вашу последовательность Фибоначчи.