Clojure中的斐波纳契数

dem*_*emi 5 functional-programming clojure

我正在学习Clojure.相当基本的任务是生成斐波纳契数列.我最终得到了必要的解决方案的副本(并且列表是相反的,呵呵):

(defn n-fib [n]
  (if (= n 1) '(1)
  (loop [i 2 l '(1 1)]
    (if (= i n)
        l
        (recur (inc i) (cons (+ (fst l) (snd l)) l))))))
Run Code Online (Sandbox Code Playgroud)

什么是更好的方式,更实用,更简洁?懒惰的序列?怎么用?例如,在使用懒惰的Haskell中,我可以写一个衬垫:

fib = 1 : 1 : zipWith + (tail fib) 
Run Code Online (Sandbox Code Playgroud)

请注意,Haskell解决方案提供无限序列(懒惰......).如果Clojure既有渴望也有懒惰的解决方案(即使是获得n长度列表),我想知道两者.

更新:我得到的另一个解决方案不是反转列表,而是使用堆栈生成它:

(defn n-fib [n]
  (defn gen [i a b]
    (if (= i 0)
        ()
        (cons (+ a b) (gen (dec i) b (+ a b)))))
  (gen n 0 1))
Run Code Online (Sandbox Code Playgroud)

Joe*_*ann 7

您可以查看http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Lazy_Fibonacci

相当于你懒惰的Haskell解决方案就是这个

 (def fib (lazy-cat [1 1] (map + (rest fib) fib)))
Run Code Online (Sandbox Code Playgroud)