0

我正在尝试使用递归解决 Clojure 中的 Project Euler 问题。以下是问题陈述:

如果我们列出所有小于 10 且是 3 或 5 的倍数的自然数,我们会得到 3、5、6 和 9。这些倍数之和是 23。

求 1000 以下所有 3 或 5 的倍数之和。

但是,下面的代码似乎给出了错误的答案。我究竟做错了什么?

(defn m?
  [x]
  (or (= (rem x 3)) (= (rem x 5))))

(defn sum-m
  [limit sum]
  (if (= limit  0)
    sum
    (recur (dec limit)
           (if (m? limit) 
             (+ sum limit)
             sum))))

(sum-m (dec 1000) 0)
4

3 回答 3

1

你没有说它给出了什么错误的答案,但我相信问题出在 m? 上:

(or (= 0 (rem x 3)) (= 0 (rem x 5)))
于 2012-06-19T02:44:47.463 回答
1

米?改成

(defn m? [x]
  (or (zero? (rem x 3))(zero? (rem x 5))))
于 2012-06-19T08:53:19.933 回答
0

我认为您希望该函数m?检查一个数字是 3 还是 5 的倍数。但它并没有这样做。您应该检查 (rem x 3) 或 (rem x 5) 中的任何一个是否为零。

对于非常大的数字,这是一个有趣的练习。例如,找出所有小于 10 亿且是 3 或 5 倍数的自然数之和。您的解在时间上是线性的,但您可以尝试更快的解。这不是您原始问题的一部分;只是一个有趣的补充。

于 2012-06-19T02:48:00.760 回答