Как мысленно смоделировать этот clojure генератор Фибоначчи? - PullRequest
0 голосов
/ 12 июня 2019

Наткнулся на эту интересную реализацию генератора Фибоначчи в ближайшем будущем.Немного трудно понять часть самообращения.Любая помощь по психическому моделированию, это было бы очень полезно.

(def fib-seq
 (lazy-cat [0 1] (map + (rest fib-seq) fib-seq)))

1 Ответ

2 голосов
/ 13 июня 2019

Макроэкспандирование (lazy-cat [0 1] (map + (rest fib-seq) fib-seq) приводит к:

(concat (lazy-seq [0 1]) (lazy-seq (map + (rest fib-seq) fib-seq)))

(map + coll1 coll2) возвращает новую коллекцию, в которой первый элемент первого списка добавляется к первому элементу второго списка, второй элемент первого списка добавляется ко второму элементу второго списка и т. Д. .

user> (map + [1 2 3 4] [1 2 3 4])
(2 4 6 8)

Итак, мы начинаем с 0 и 1, а затем получаем первый из остальных элементов fib-seq (1) с первым элементом fib-seq (0), это приводит к 1. Затем мы получаем снова следующий элемент fib-seq, то есть 1, который мы только что осознали, и добавьте его ко второму элементу fib-seq (1), который приводит к 2, и т. д.

Таким образом, мы лениво согласимся [0 1] с результатом суммирования двух коллекций после того, как он сдвинут на 1:

[0 1] <+ concat>
[1 + 0
 1 + 1
 2 + 1
 3 + 2
 ...]
user> (take 10 fib-seq)
(0 1 1 2 3 5 8 13 21 34)

Надеюсь, это поможет.

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