我试图得到前10个斐波纳契数如下:
(take 10 (fn fibgen [a b] (cons a (fibgen b (+ a b))) 0 1))其思想是fibgen创建一个惰性序列(无限流)。不幸的是,这会导致以下错误:
IllegalArgumentException不知道如何从: user$eval10144$fibgen__10145 clojure.lang.RT.seqFrom (RT.java:528)
怎么解决这个问题呢?
发布于 2016-07-02 19:43:34
我觉得你只是做了个错字。下面是您的fibgen函数看起来是如何重新格式化的:
(fn fibgen [a b]
(cons a (fibgen b (+ a b)))
0
1)这个函数实现了从a和b开始的整个Fibonacci序列,然后返回1。您要做的是定义一个函数,返回序列,用0和1调用它,然后从该序列中获取前十项:
(take 10 ((fn fibgen [a b] (cons a (fibgen b (+ a b)))) 0 1))如果运行此操作,将得到整数溢出的ArithmeticException,因为Fibonacci序列中的数字会很快离开64位整数的范围。您可以使用+'修复此问题。
(take 10 ((fn fibgen [a b] (cons a (fibgen b (+' a b)))) 0 1))因为Clojure并不懒惰,这将尝试实现整个Fibonacci序列,这将导致StackOverflowError。尽管Clojure本身并不懒惰,但您可以创建一个懒惰序列,在本例中,这将产生基本相同的效果:
(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)https://stackoverflow.com/questions/38163552
复制相似问题