问题描述:
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
解决方案1:
(defn sum-3-or-5-multiple-below
[x]
"If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000."
(apply + (filter #(or (= 0 (rem % 3))
(= 0 (rem % 5)))
(take (- x 1) (iterate inc 1)))))
解决方案2:
(defn sum-3-or-5-multiple
[x]
(loop [current-num 1, sum 0]
(if (< current-num x)
(if(or
(= 0 (rem current-num 3))
(= 0 (rem current-num 5)))
(recur (inc current-num)(+ sum current-num))
(recur (inc current-num) sum)) sum)))
性能测试:
方案1:
(time (sum-3-or-5-multiple-below 100000))
;"Elapsed time: 157.460515 msecs"
方案2:
(time (sum-3-or-5-multiple 100000))
"Elapsed time: 23.742962 msecs"
分析:
方案1首先用iterate 函数重复加1产生整个序列,然后重序列中筛选所出需要的结果再次组成序列,最后把序列中的结果相加得出结论。所以正如预计的,当数据达到百亿的时候,系统陷入长时间等待中,数据再大,内存可能溢出。用 (range 1 x) 代替
(take (- x 1) (iterate inc 1)) ;性能有所提升,但是还是赶不上方案2的性能。
方案2使用了clojure中的尾递归优化技术。参数current-num初始值是1,sum初始值是0,sum用来保存每次递归的累积结果。每次递归,只与上一次递归的结果相关,因此上上一次递归的数据可以垃圾回收,不会造成内存溢出。
分享到:
相关推荐
该存储库是使用Clojure解决Euler问题的支架。 它以有组织的结构生成规格和解决方案存根,从而使生活稍微好一些。 安装 如果尚未安装,则将其添加到您的路径中。 签出这个项目: $ git clone git@github....
Clojure骇客解决了Euler项目的问题。 目的是用惯用的Clojure编写功能解决方案。 用法 大多数解决方案都是完整的,并且完全独立地包含在具有“解决”功能的唯一名称空间中。 有些正在“进行中”。 执照 版权所有:...
欧拉计划 问题1-2、4、6、8-10、12、14、21、24-26、32、34、36、39、41、46、49、52、55-58、62、65的Clojure解决方案70-74、87、92、97、124、173-174、179、187、214运行解决方案使用以下命令行运行解决方案: ...
这本书不仅讲解了Clojure的基本语法和API,而且通过实例展示了如何使用Clojure解决实际问题。Halloway详细阐述了Clojure的REPL(Read-Eval-Print Loop)工作原理,以及如何利用它进行开发和测试。他还讨论了Clojure...
【1】[Clojure编程乐趣](The Joy of Clojure).pdf 【2】Clojure – Functional Programming for the JVM中文版.pdf 【3】Clojure Cookbook.pdf 【4】Clojure Data Analysis Cookbook.pdf 【5】clojure Hand book...
[2009] Programming Clojure.(Stuart Halloway).[1934356336].pdf [2010] Functional Programming with Clojure - Simple Concurrency on the JVM.(Tim Berglund, Matthew McCullough).[193650202X].pdf [2010] ...
欧拉解决Clojure中的Euler项目问题的方法。 持续的爱好。执照版权所有:copyright:2012-2015 Dave Yarwood 在Eclipse Public License 1.0版下分发。
Clojure的设计目标是提供一个高效、并发、可移植的环境,适合解决现代软件开发中的复杂问题。在这个“Clojure编程乐趣”中,我们将深入探讨Clojure的核心概念和特性。 首先,Clojure强调函数式编程,这意味着程序被...
1. **Elegance**: Clojure的设计简洁明了,使得开发者能够专注于问题的核心,而不是被各种细节所困扰。 2. **Lisp Reloaded**: 尽管继承了Lisp的强大功能,但Clojure并不受限于Lisp的历史负担,它采用了更现代的...
使用Clojure编程,随着程序的增长,并不会变得更复杂难以理解,反而会变得更简单、表达性更强。Clojure鼓励开发者尝试在其他语言中过于复杂而通常不会尝试的事情,例如并发编程、不可变性和惰性数据结构。因为...
作为一种函数式编程语言,它被设计为一种既高效又表达力强的工具,用于解决并发问题。Clojure Handbook是一份关于Clojure编程语言的学习笔记,旨在为读者提供一个方便的备查材料,以加深对Clojure语言特性的理解和...
读者将通过实例学习如何运用Clojure解决实际问题,提升自己的编程技巧。 总的来说,《Programming Clojure 第三版》是一本全方位的Clojure指南,适合初学者和经验丰富的开发者。它涵盖了Clojure的所有重要方面,...
### Clojure入门教程知识...- 对于希望深入了解函数式编程或在JVM上寻找高效编程解决方案的开发者而言,Clojure是一个值得探索的选择。通过实践和社区的支持,学习者可以快速掌握Clojure的核心概念并应用于实际项目中。
其次,Clojure 1.6 引入了更好的错误报告机制,使得开发者能够更快地定位和解决问题。此外,它还增强了ClojureScript的互操作性,使得在浏览器环境下的开发更为便捷。 Clojure的核心特性之一是其丰富的数据结构。...
- **数据结构和序列操作**:解释 Clojure 中常用的数据结构,如列表、向量、集合和映射,并展示如何使用这些结构进行数据处理。 - **函数式编程**:探讨 Clojure 如何支持纯函数式编程风格,包括高阶函数、闭包和...
Lacinia将Clojure的这些优点带入了GraphQL领域,允许开发者用熟悉的Clojure语法定义GraphQL类型、字段和解析器。这种结合使得开发者可以利用Clojure的宏系统来创建复杂的GraphQL schema,同时保持代码的可读性和可...
Clear, practical Clojure for the professional programmer Professional Clojure is the experienced developer's guide to functional programming using the Clojure language. Designed specifically to meet ...