`
hotcharm
  • 浏览: 17114 次
  • 性别: Icon_minigender_1
  • 来自: 义乌
最近访客 更多访客>>
社区版块
存档分类
最新评论

用clojure解决 euler problem 1

 
阅读更多
问题描述:

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用来保存每次递归的累积结果。每次递归,只与上一次递归的结果相关,因此上上一次递归的数据可以垃圾回收,不会造成内存溢出。




分享到:
评论

相关推荐

    欧拉公式求圆周率的matlab代码-euler:我对欧拉计画的解决方案(clojure)

    该存储库是使用Clojure解决Euler问题的支架。 它以有组织的结构生成规格和解决方案存根,从而使生活稍微好一些。 安装 如果尚未安装,则将其添加到您的路径中。 签出这个项目: $ git clone git@github....

    欧拉公式求圆周率的matlab代码-project-euler:Clojure解决Euler项目问题​​的方法

    Clojure骇客解决了Euler项目的问题。 目的是用惯用的Clojure编写功能解决方案。 用法 大多数解决方案都是完整的,并且完全独立地包含在具有“解决”功能的唯一名称空间中。 有些正在“进行中”。 执照 版权所有:...

    project-euler-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电子书

    这本书不仅讲解了Clojure的基本语法和API,而且通过实例展示了如何使用Clojure解决实际问题。Halloway详细阐述了Clojure的REPL(Read-Eval-Print Loop)工作原理,以及如何利用它进行开发和测试。他还讨论了Clojure...

    clojure相关书籍1

    【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...

    Clojure电子书合集1(12本)

    [2009] Programming Clojure.(Stuart Halloway).[1934356336].pdf [2010] Functional Programming with Clojure - Simple Concurrency on the JVM.(Tim Berglund, Matthew McCullough).[193650202X].pdf [2010] ...

    euler:Clojure中的Project Euler解决方案

    欧拉解决Clojure中的Euler项目问题​​的方法。 持续的爱好。执照版权所有:copyright:2012-2015 Dave Yarwood 在Eclipse Public License 1.0版下分发。

    Clojure编程乐趣]+clojure_programming.pdf

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

    Programming Clojure 英文电子版

    1. **Elegance**: Clojure的设计简洁明了,使得开发者能够专注于问题的核心,而不是被各种细节所困扰。 2. **Lisp Reloaded**: 尽管继承了Lisp的强大功能,但Clojure并不受限于Lisp的历史负担,它采用了更现代的...

    Practical Clojure.pdf

    使用Clojure编程,随着程序的增长,并不会变得更复杂难以理解,反而会变得更简单、表达性更强。Clojure鼓励开发者尝试在其他语言中过于复杂而通常不会尝试的事情,例如并发编程、不可变性和惰性数据结构。因为...

    Clojure Handbook(2012.11.1)

    作为一种函数式编程语言,它被设计为一种既高效又表达力强的工具,用于解决并发问题。Clojure Handbook是一份关于Clojure编程语言的学习笔记,旨在为读者提供一个方便的备查材料,以加深对Clojure语言特性的理解和...

    programming-clojure-3rd

    读者将通过实例学习如何运用Clojure解决实际问题,提升自己的编程技巧。 总的来说,《Programming Clojure 第三版》是一本全方位的Clojure指南,适合初学者和经验丰富的开发者。它涵盖了Clojure的所有重要方面,...

    Clojure入门教程- Clojure – Functional Programming for the JVM中文版

    ### Clojure入门教程知识...- 对于希望深入了解函数式编程或在JVM上寻找高效编程解决方案的开发者而言,Clojure是一个值得探索的选择。通过实践和社区的支持,学习者可以快速掌握Clojure的核心概念并应用于实际项目中。

    clojure1.6

    其次,Clojure 1.6 引入了更好的错误报告机制,使得开发者能够更快地定位和解决问题。此外,它还增强了ClojureScript的互操作性,使得在浏览器环境下的开发更为便捷。 Clojure的核心特性之一是其丰富的数据结构。...

    Clojure Data Analysis Cookbook

    - **数据结构和序列操作**:解释 Clojure 中常用的数据结构,如列表、向量、集合和映射,并展示如何使用这些结构进行数据处理。 - **函数式编程**:探讨 Clojure 如何支持纯函数式编程风格,包括高阶函数、闭包和...

    Lacinia纯Clojure实现的GraphQL

    Lacinia将Clojure的这些优点带入了GraphQL领域,允许开发者用熟悉的Clojure语法定义GraphQL类型、字段和解析器。这种结合使得开发者可以利用Clojure的宏系统来创建复杂的GraphQL schema,同时保持代码的可读性和可...

    Professional.Clojure.1119267277

    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 ...

Global site tag (gtag.js) - Google Analytics