`
kdlan
  • 浏览: 13006 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

clojure 斐波那契数列一个解法的解析

 
阅读更多
最近做 4Clojure的fib序列的一个题 http://www.4clojure.com/problem/26

自己用的是

#(take % (map first (iterate (fn [[a b]] [b (+ a b)]) [1 1])))


做完以后看到一个答案用的是这种方式
#((apply comp (repeat (- % 2) (fn [x] (conj x (+ (peek x) (peek (pop x))))))) [1 1])


看了半天才理解下来是怎么回事,这里记录下来


这里把代码拆开来 类似于

(def compute (fn [x] (conj x (+ (peek x) (peek (pop x))))))
(def fn-seq (repeat (- n 2) compute)
(def fib (apply comp fn-seq))
(fib [1 1])



首先
(fn [x] (conj x (+ (peek x) (peek (pop x)))))

这段函数单独来看比较好理解,就是把vector尾部的两个记录相加,添加到x的末尾

(repeat (- % 2) (fn [x] (conj x (+ (peek x) (peek (pop x))))))

重复生成了(- % 2) 次 后面定义的那个函数,返回一个包含同一个fn的seq

(apply comp fn-seq)

就是把fn-seq作为参数,调用comp,来生成新的fn,这个fn的作用是不停的调用上面定义的那个fn compute

最后是调用fn,传入参数[1 1]
当 n=3的时候
就会(compute [1 1]) => [1 1 2]
n=4 时
(compute (compute [1 1])) => [1 1 2 3]

不过这个解法还是有bug
n<=1的时候,还是返回[1 1]
repeat反回了空seq ()

看了comp的源代码,参数为空时会返回identity
这样就直接返回了[1 1]

分享到:
评论

相关推荐

    postagga, 在纯Clojure和ClojureScript中,用来解析自然语言的库.zip

    postagga, 在纯Clojure和ClojureScript中,用来解析自然语言的库 postagga 但是,如果思想破坏语言,语言也会破坏思想。"George Orwell,1984postagga 是一套工具,帮助你生成高效和自包含的自然语言处理器。 你可以...

    Atom-remus,关注clojure的rss/atom提要解析器。通过在github上创建一个帐户,为igrishaev/remus开发做出贡献。.zip

    Atom-remus.zip,clojure的关注rss/atom提要解析器雷姆斯,atom是一个用web技术构建的开源文本编辑器。

    Selmer, 在Clojure中,一个快速Django 启发的模板系统.zip

    Selmer, 在Clojure中,一个快速Django 启发的模板系统 Selmer 一个快速的 Django 插件,为Clojure激发模板系统。安装命令行 Leiningen 备忘文档备注文档用法 跳转到筛选器内置过滤器add count count? not-empty f

    Clojure调用Java类的一个实例

    在上述代码中,`clojure.java.jdk`是一个Clojure库,提供了对Java JDK的便捷访问。`class-for-name`函数用于加载并返回指定类的Class对象,然后我们可以通过`.sayHello`调用实例的方法。 此外,Clojure还可以处理...

    Lacinia纯Clojure实现的GraphQL

    Lacinia是基于Clojure实现的一个GraphQL解析器,它为Clojure开发者提供了直接在Clojure环境中实现GraphQL服务的能力。 Lacinia的设计理念是保持与GraphQL规范的紧密一致性,同时充分利用Clojure的简洁性和强大的...

    markdown-clj, 在Clojure中,Markdown 解析器.zip

    markdown-clj, 在Clojure中,Markdown 解析器 用 clojure/脚本编写的 Markdown 解析器 演示你可以在这里试用解析器 。安装编译为Clojure和ClojureScript的Markdown 解析器。 注意:0.9.68 之前的markdown-cl

    Clojure编程乐趣]+clojure_programming.pdf

    Clojure的设计目标是提供一个高效、并发、可移植的环境,适合解决现代软件开发中的复杂问题。在这个“Clojure编程乐趣”中,我们将深入探讨Clojure的核心概念和特性。 首先,Clojure强调函数式编程,这意味着程序被...

    Python-Nightlight一个Clojure嵌入式编辑器

    Python-Nightlight 是一个独特的项目,它将Clojure编程语言的交互式环境嵌入到Python应用程序中,为开发者提供了一个集成的开发体验。这个编辑器设计的目标是促进Clojure代码的编写、测试和调试,特别是在Python环境...

    Practical Clojure.pdf

    根据提供的文件内容,我们可以提取出以下关于Clojure语言的知识点: Clojure是一种编程语言,它...希望这本书能够为读者打开Clojure的门,就像它为作者所做的那样,并且展示Clojure作为一个有趣、表达性和成熟的语言。

    Python-Clojurecademy一个交互式平台提供基于Clojure的课程

    Python-Clojurecademy是一个独特的在线学习平台,专注于教授Clojure编程语言。它借鉴了Codecademy的成功模式,为用户提供了一个交互式的环境,使学习者能够实时实践Clojure代码,从而增强他们的编程技能。Clojure是...

    Programming Clojure 英文电子版

    ### 编程Clojure:全面解析与学习指南 #### 一、Clojure语言概述 《Programming Clojure》是一本深入探讨Clojure编程语言的书籍,该书由Stuart Halloway编写,出版于2009年3月,由Pragmatic Bookshelf出版社发行。...

    clojure1.3.0及资料

    4. **Clojure 1.4.0 Alpha2**: "clojure-clojure-clojure-1.4.0-alpha2-12-gec59eba.zip"是Clojure 1.4.0的一个早期预览版本。这个版本可能包含了1.3.0之后的进一步改进和新功能,对于关注Clojure演进的开发者来说,...

    clj-antlr, ANTLR 4解析器的Clojure绑定.zip

    clj-antlr, ANTLR 4解析器的Clojure绑定 clj-antlr面向 ANTLR 4 解析器库的Clojure绑定,一个自适应的( * ) 。 看起来很像 Instaparse,只有更快的语法定义,更丰富的语法定义,而且没有令人愉悦的。安装只需将 clj-...

    clojure电子书

    《Clojure电子书》集合包含了三本关于Clojure编程的重要书籍和一个Leiningen的Windows安装程序,这对于学习和深入理解Clojure语言至关重要。Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,...

    Python-利用Clojure实现的一个可拖放的看板示例

    标题中的"Python-利用Clojure实现的一个可拖放的看板示例"表明这是一个结合了Python和Clojure技术的项目,旨在创建一个可交互式的看板应用,支持用户通过拖放操作来管理任务或信息。看板在项目管理和敏捷开发中广泛...

    clojure eclipse

    在Eclipse中使用Clojure开发,你需要安装Leiningen,这是一个Clojure项目管理工具,它可以帮助你创建、构建和管理Clojure项目。Leiningen能够生成项目的骨架结构,包含必需的依赖和配置文件,使得开发者可以快速开始...

    clojure-1.10.2-alpha2.jar

    Clojure还有一个特色是软件事务存储(Software Transactional Memory,STM),其支持用事务代替锁和互斥器来更新共享内存。STM还是一个有争议的技术,还需要更好的证明自己,一个简单的办法就是访问一个JVM上的实现...

    clojure1.6

    Clojure 1.6 是一个基于 Lisp 语系的现代函数式编程语言,它运行在Java虚拟机(JVM)上。Lisp是一种历史悠久且影响力深远的编程范式,以其特有的括号语法和强大的宏系统著称。Clojure的设计目标是提供一种与Java平台...

Global site tag (gtag.js) - Google Analytics