来自命令式编程语言,我试图围绕 Clojure 进行思考,希望将其用于多线程功能。
来自4Clojure的问题之一是编写一个函数来生成一个长度为 N 的斐波那契数列列表,其中 N > 1。我编写了一个函数,但鉴于我的背景有限,我想了解一下这是否是 Clojure 的最佳处理方式.代码如下:
(fn fib [x] (cond
(= x 2) '(1 1)
:else (reverse (conj (reverse (fib (dec x))) (+ (last (fib (dec x))) (-> (fib (dec x)) reverse rest first))))
))
最佳答案
最惯用的“函数式”方法可能是创建一个无限懒惰的斐波那契数列,然后提取前 n 个值,即:
(take n some-infinite-fibonacci-sequence)
以下链接有一些非常有趣的方法可以沿着这些线生成斐波那契数列:
http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Lazy_Fibonacci
最后,这是另一个值得考虑的有趣实现:
(defn fib [n]
(let [next-fib-pair (fn [[a b]] [b (+ a b)])
fib-pairs (iterate next-fib-pair [1 1])
all-fibs (map first fib-pairs)]
(take n all-fibs)))
(fib 6)
=> (1 1 2 3 5 8)
它并不像它应有的那样简洁,但很好地展示了使用 Clojure 的解构、惰性序列和高阶函数来解决问题。
关于clojure - 清理Clojure函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7396295/