使用无限流生成前 10 个斐波那契数

Generate first 10 Fibonacci numbers using infinite stream

我正在尝试获取前 10 个斐波那契数列,如下所示:

(take 10 (fn fibgen [a b] (cons a (fibgen b (+ a b))) 0 1))

想法是 fibgen 创建一个惰性序列(无限流)。不幸的是,这会产生以下错误:

IllegalArgumentException Don't know how to create ISeq from:
user$eval10144$fibgen__10145 clojure.lang.RT.seqFrom (RT.java:528)

如何解决这个问题?

我想你刚刚打错了字。这是您的 fibgen 函数重新格式化后的样子:

(fn fibgen [a b]
  (cons a (fibgen b (+ a b)))
  0
  1)

这个函数实现了从 ab 开始的整个斐波那契数列,然后是 returns 1. 你的意思是定义一个 returns 的函数序列,用 0 和 1 调用它,然后从该序列中取出前十项:

(take 10 ((fn fibgen [a b] (cons a (fibgen b (+ a b)))) 0 1))

如果你 运行 这个,你会得到一个 ArithmeticException 整数溢出,因为斐波那契数列中的数字很快就会离开 64 位整数的范围。您可以使用 +':

修复此问题
(take 10 ((fn fibgen [a b] (cons a (fibgen b (+' a b)))) 0 1))

由于 Clojure 不懒惰,这将尝试实现 整个 斐波那契数列,这将导致 WhosebugError。尽管 Clojure 本身并不懒惰,但是,您 可以 创建一个 lazy sequence,在这种情况下它会产生基本相同的效果:

(take 10 ((fn fibgen [a b] (lazy-seq (cons a (fibgen b (+' a b))))) 0 1))
;;=> (0 1 1 2 3 5 8 13 21 34)