5

我正在学习 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))
4

2 回答 2

7

您可能想查看http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Lazy_Fibonacci

相当于您的懒惰 Haskell 解决方案是这个

 (def fib (lazy-cat [1 1] (map + (rest fib) fib)))
于 2013-07-08T03:34:58.920 回答
0

这个不会生成整个序列,但它擅长使用迭代算法找到第 n 个斐波那契数。我只是在学习clojure,所以我很想知道人们对这种方法的看法以及它是否有问题。它不漂亮,也不聪明,但它似乎确实有效。

(defn fib [n]
  (if (< n 2)
    n
    (loop [i 1
           lst 0
           nxt 1]
      (if (>= i n)
        nxt
        (recur (inc i) nxt (+' lst nxt))))))
于 2019-10-07T05:45:14.413 回答