使用无限流生成前 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)
这个函数实现了从 a
和 b
开始的整个斐波那契数列,然后是 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)
我正在尝试获取前 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)
这个函数实现了从 a
和 b
开始的整个斐波那契数列,然后是 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)