首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用无限流生成前10个斐波纳契数

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

Stack Overflow用户
提问于 2016-07-02 19:05:28
回答 1查看 187关注 0票数 1

我试图得到前10个斐波纳契数如下:

代码语言:javascript
复制
(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)

怎么解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-02 19:43:34

我觉得你只是做了个错字。下面是您的fibgen函数看起来是如何重新格式化的:

代码语言:javascript
复制
(fn fibgen [a b]
  (cons a (fibgen b (+ a b)))
  0
  1)

这个函数实现了从ab开始的整个Fibonacci序列,然后返回1。您要做的是定义一个函数,返回序列,用0和1调用它,然后从该序列中获取前十项:

代码语言:javascript
复制
(take 10 ((fn fibgen [a b] (cons a (fibgen b (+ a b)))) 0 1))

如果运行此操作,将得到整数溢出的ArithmeticException,因为Fibonacci序列中的数字会很快离开64位整数的范围。您可以使用+'修复此问题。

代码语言:javascript
复制
(take 10 ((fn fibgen [a b] (cons a (fibgen b (+' a b)))) 0 1))

因为Clojure并不懒惰,这将尝试实现整个Fibonacci序列,这将导致StackOverflowError。尽管Clojure本身并不懒惰,但您可以创建一个懒惰序列,在本例中,这将产生基本相同的效果:

代码语言:javascript
复制
(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)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38163552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档