最近做 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中,用来解析自然语言的库 postagga 但是,如果思想破坏语言,语言也会破坏思想。"George Orwell,1984postagga 是一套工具,帮助你生成高效和自包含的自然语言处理器。 你可以...
Atom-remus.zip,clojure的关注rss/atom提要解析器雷姆斯,atom是一个用web技术构建的开源文本编辑器。
Selmer, 在Clojure中,一个快速Django 启发的模板系统 Selmer 一个快速的 Django 插件,为Clojure激发模板系统。安装命令行 Leiningen 备忘文档备注文档用法 跳转到筛选器内置过滤器add count count? not-empty f
在上述代码中,`clojure.java.jdk`是一个Clojure库,提供了对Java JDK的便捷访问。`class-for-name`函数用于加载并返回指定类的Class对象,然后我们可以通过`.sayHello`调用实例的方法。 此外,Clojure还可以处理...
Lacinia是基于Clojure实现的一个GraphQL解析器,它为Clojure开发者提供了直接在Clojure环境中实现GraphQL服务的能力。 Lacinia的设计理念是保持与GraphQL规范的紧密一致性,同时充分利用Clojure的简洁性和强大的...
markdown-clj, 在Clojure中,Markdown 解析器 用 clojure/脚本编写的 Markdown 解析器 演示你可以在这里试用解析器 。安装编译为Clojure和ClojureScript的Markdown 解析器。 注意:0.9.68 之前的markdown-cl
Clojure的设计目标是提供一个高效、并发、可移植的环境,适合解决现代软件开发中的复杂问题。在这个“Clojure编程乐趣”中,我们将深入探讨Clojure的核心概念和特性。 首先,Clojure强调函数式编程,这意味着程序被...
Python-Nightlight 是一个独特的项目,它将Clojure编程语言的交互式环境嵌入到Python应用程序中,为开发者提供了一个集成的开发体验。这个编辑器设计的目标是促进Clojure代码的编写、测试和调试,特别是在Python环境...
根据提供的文件内容,我们可以提取出以下关于Clojure语言的知识点: Clojure是一种编程语言,它...希望这本书能够为读者打开Clojure的门,就像它为作者所做的那样,并且展示Clojure作为一个有趣、表达性和成熟的语言。
Python-Clojurecademy是一个独特的在线学习平台,专注于教授Clojure编程语言。它借鉴了Codecademy的成功模式,为用户提供了一个交互式的环境,使学习者能够实时实践Clojure代码,从而增强他们的编程技能。Clojure是...
### 编程Clojure:全面解析与学习指南 #### 一、Clojure语言概述 《Programming Clojure》是一本深入探讨Clojure编程语言的书籍,该书由Stuart Halloway编写,出版于2009年3月,由Pragmatic Bookshelf出版社发行。...
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绑定 clj-antlr面向 ANTLR 4 解析器库的Clojure绑定,一个自适应的( * ) 。 看起来很像 Instaparse,只有更快的语法定义,更丰富的语法定义,而且没有令人愉悦的。安装只需将 clj-...
《Clojure电子书》集合包含了三本关于Clojure编程的重要书籍和一个Leiningen的Windows安装程序,这对于学习和深入理解Clojure语言至关重要。Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,...
标题中的"Python-利用Clojure实现的一个可拖放的看板示例"表明这是一个结合了Python和Clojure技术的项目,旨在创建一个可交互式的看板应用,支持用户通过拖放操作来管理任务或信息。看板在项目管理和敏捷开发中广泛...
在Eclipse中使用Clojure开发,你需要安装Leiningen,这是一个Clojure项目管理工具,它可以帮助你创建、构建和管理Clojure项目。Leiningen能够生成项目的骨架结构,包含必需的依赖和配置文件,使得开发者可以快速开始...
Clojure还有一个特色是软件事务存储(Software Transactional Memory,STM),其支持用事务代替锁和互斥器来更新共享内存。STM还是一个有争议的技术,还需要更好的证明自己,一个简单的办法就是访问一个JVM上的实现...
Clojure 1.6 是一个基于 Lisp 语系的现代函数式编程语言,它运行在Java虚拟机(JVM)上。Lisp是一种历史悠久且影响力深远的编程范式,以其特有的括号语法和强大的宏系统著称。Clojure的设计目标是提供一种与Java平台...