Я новичок в закрытии, и я хотел понять, о чем идет речь. Решив, что лучший способ почувствовать это - написать простой код, я решил начать с функции Фибоначчи.
Моей первой попыткой было:
(defn fib [x, n]
(if (< (count x) n)
(fib (conj x (+ (last x) (nth x (- (count x) 2)))) n)
x))
Чтобы использовать это, мне нужно заполнить x значением [0 1] при вызове функции. У меня вопрос, не оборачивая его отдельной функцией, можно ли написать одну функцию, которая принимает только то количество возвращаемых элементов?
Прочитав немного, я нашел несколько более эффективных способов достижения той же функциональности:
(defn fib2 [n]
(loop [ x [0 1]]
(if (< (count x) n)
(recur (conj x (+ (last x) (nth x (- (count x) 2)))))
x)))
и
(defn fib3 [n]
(take n
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1]))))
В любом случае, скорее для упражнения, чем для чего-либо еще, может ли кто-нибудь помочь мне с лучшей версией чисто рекурсивной функции Фибоначчи? Или, может быть, использовать лучшую / другую функцию?