Вкратце, как построить ленивую последовательность, используя функцию итерации - PullRequest
7 голосов
/ 21 декабря 2011

Документ 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 [[ab]] [b (+ ab)]) есть две скобки?

Другой пример можно найти здесь :

(defn iter [[x y]]
  (vector y (+ x y)))

(nth (iterate iter [0 1]) 10000)

1 Ответ

15 голосов
/ 21 декабря 2011

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 ...) получает первое значение в каждой паре, что дает вам вашу последовательность Фибоначчи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...