clojure - 清理Clojure函数

标签 clojure refactoring fibonacci

来自命令式编程语言,我试图围绕 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/

相关文章:

clojure - 不知道如何从 : clojure. lang.Symbol 创建 ISeq

ruby-on-rails - 重构方法不接受属性

unit-testing - 您如何测试/更改未经测试和不可测试的代码?

function - 如何读取用户输入的整数并在 Forth 中提供函数?

c++ - 快速加倍查找斐波那契数,函数在 C++ 中不起作用

c++ - 编写一个程序,计算并输出前 N 个奇数斐波那契数,以逗号和空格分隔。 N 从标准输入输入

unit-testing - 如何在用 ring-mock 编写的 Clojure Web 应用程序测试中处理 session ?

clojure - 构建 LISP 机器需要多少原语?十、七还是五?

clojure - 使用开头?功能

html - 集成Leaflet和Bootstrap : help refactoring my css