Я новичок в clojure, который хотел посмотреть, о чем вся эта суета. Полагая, что лучший способ понять это - написать простой код, я думал, что начну с функции Фибоначчи.Рекурсивная функция Фибоначчи в Clojure
Моя первая работа была:
(defn fib [x, n]
(if (< (count x) n)
(fib (conj x (+ (last x) (nth x (- (count x) 2)))) n)
x))
Для использования этого мне нужно семян х с [0 1] при вызове функции. Мой вопрос заключается в том, что, не обертывая его отдельной функцией, можно ли написать одну функцию, которая возвращает только число возвращаемых элементов?
Делая некоторое чтение вокруг привел меня к некоторым более эффективным способам достижения того же funcionality:
(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]))))
Во всяком случае, больше ради упражнения, чем что-либо еще, может кто-нибудь помогите мне с лучшей версией чисто рекурсивной функции Фибоначчи? Или, возможно, поделитесь лучшей/другой функцией?
fib3 является самым Clojure'ish из этих –