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)
您可以查看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)