我正在学习 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))))))
有什么更好的方法,更实用,更简洁?惰性序列?如何使用它们?例如,在使用懒惰的 Haskell 中,我可以写一个衬里:
fib = 1 : 1 : zipWith + (tail fib)
请注意,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))