Пытаясь понять clojure рекурсию Фибоначчи - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь понять приведенную ниже программу, чтобы найти ряд Фибоначчи, используя рекурсию в Clojure.

(defn fib
[x] 
(loop [i '(1 0)]
    (println i)
    (if (= x (count i))
        (reverse i)
        (recur 
          (conj i (apply + (take 2 i))))))) // This line is not clear

Например, для вызова fib(4) Я получаю следующий вывод:

(1 0)
(1 1 0)
(2 1 1 0)
(0 1 1 2)

Что, согласно моему заключению, conj, кажется, добавляет значение (apply + (take 2 i)) к началу i.Но это не поведение conj.Может кто-нибудь помочь мне понять, как именно это работает?

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

За Clojure документация:

«Добавление» может происходить в разных «местах» в зависимости от типа бетона.

Добавление к списку происходит в начале списка, добавление к вектору происходит в конце ...

См. Больше примеров на https://clojuredocs.org/clojure.core/conj

0 голосов
/ 13 мая 2018

То, что является поведением conj, для списков .conj не всегда добавляет в конец:

(conj '(1) 2) ; '(2 1)

(conj [1] 2) ; [1 2]

Расположение добавленного элемента зависит от типа коллекции.Поскольку добавление в конец списка стоит дорого, conj добавляет вместо него на передний план.Это та же самая операция (добавление в список), но оптимизированная для используемой коллекции.

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