рекурсивную функцию Фибоначчи в 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]))))

В любом случае, скорее для упражнения, чем для чего-либо еще, может ли кто-нибудь помочь мне с лучшей версией чисто рекурсивной функции Фибоначчи? Или, может быть, использовать лучшую / другую функцию?

27
задан richc 20 January 2012 в 10:28
поделиться