Я новичок в clojure, который хотел посмотреть, о чем вся эта суета. Полагая, что лучший способ понять это - написать простой код, я думал, что начну с функции Фибоначчи.
Мое первое усилие было:
(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]))))
Во всяком случае, больше ради упражнения, чем что-либо еще, может ли кто-нибудь помочь мне с лучшей версией чисто рекурсивной функции Фибоначчи? Или, возможно, использовать лучшую/различную функцию?