我正在尝试阅读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)
成功(如果您有足够的内存)