我正在尝试阅读Stuart Halloway的《 Programming Clojure》一书。这整个功能对我来说还是很新的。

我明白

(defn fibo[]
    (map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))

懒惰地生成斐波那契数列。我不明白为什么
(last (take 1000000 (fibo)))

工作,而
(nth (fibo) 1000000)

引发OutOfMemoryError。有人可以解释这两个表达式有何不同吗? (nth)是否以某种方式坚持了序列的开头?

谢谢!

最佳答案

我认为您正在谈论的是google group中讨论的问题,Rich Hickey提供的patch解决了该问题。后来出版的《鞭打》(Whick)这本书没有涉及这个主题。

clojure 1.3中,您的nth示例对fibo函数进行了较小的改进。现在,由于1.3中的更改,我们应该显式标记M以使用任意精度,否则它属于throwIntOverflow

(defn fibo[]
  (map first (iterate (fn [[a b]] [b (+ a b)]) [0M 1M])))

随着这些变化
(nth (fibo) 1000000)

成功(如果您有足够的内存)

10-07 18:30