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