使用map / reduce在Clojure中实现fibonacci

时间:2010-12-07 12:14:53

标签: clojure fibonacci reduce

是否有可能使用reduce有效地在Clojure中实现斐波纳契系列? “累加器”包含什么?

我想它一定是懒惰的。显而易见的是如何使用递归或循环/重复。

3 个答案:

答案 0 :(得分:15)

您可以使用一对连续的斐波那契值作为累加器,如下所示:

(reduce 
  (fn [[a b] _] [b (+ a b)])  ; function to calculate the next pair of values
  [0 1]                       ; initial pair of fibonnaci numbers
  (range 10))                 ; a seq to specify how many iterations you want

=> [55 89]

由于创建了大量中间对并使用多余的范围序列来驱动正确的迭代次数,因此这不是特别有效,但从算法的角度来看它是O(n)(即与效率相同)迭代解决方案,比天真的递归方法好得多。

答案 1 :(得分:5)

不使用map / reduce,但迭代也可以避免递归。

(defn iter [[x y]]
  (vector y (+ x y)))

(nth (iterate iter [0 1]) 10000)

英特尔2.4 Ghz需要21毫秒

在同一台机器上,减少需要61毫秒。不确定为什么迭代更快。

   (time (reduce 
     (fn [[a b] _] [b (+ a b)])  ; function to calculate the next pair of values
     [0 1]                       ; initial pair of fibonnaci numbers
     (range 10000)))

答案 2 :(得分:-1)

这将为您提供前1000个Fibonacci数字(大小为range + 2)的向量,处理函数的第二个参数(range)作为计数器:

(reduce 
  (fn [a b] (conj a (+' (last a) (last (butlast a)))))  
  [0 1]                      
  (range 998))