【发布时间】:2017-02-18 07:39:17
【问题描述】:
我试图解决欧拉计划问题 1。我注意到一个序列导致每 15 个数字更快地解决。
这是 Clojure 代码
(defn fifteenator [n]
(* 15 (+ (* (+ 1 n) 3) (* (/ (+ (* n n) n) 2) 7))))
对于 15 n 是 0 对于 30 n 是 1 等等。
所以我可以计算能被 15 整除的最接近的数字,并且只进行一些递归计算。但仍然有一个 HackerRank 测试用例超时。在我开始分析代码之前,我想确定我的推理是否正确。有没有更快的计算方法,还是我应该学习分析 Clojure?
【问题讨论】:
-
您可以通过将语句包装在
time中来计算评估时间,该语句会打印出标准输出所需的时间。 -
几点提示: 1、
i到n但不包括(range i n i)的倍数序列是(range i n i)。 2. 您可以使用(reduce + ...)或(apply + ...)对序列求和。 3. 如果将 3 的倍数和 5 的倍数相加,则将 15 的倍数数两次。使用arithmetic progressions的代数有更快的解决方案 -
SBCL Common Lisp 中的相同算法在不到一秒的时间内完成了所有的谜题。我想我需要学习分析 Clojure。
-
好吧,您提供的代码仅由基本数学组成,不是递归的。因此,该功能不应超过几纳秒。由于您没有将算法的其余部分提供给我们,因此我们无法确定是否有更快的方法。
标签: clojure