0

再帰を使用してClojureのプロジェクトオイラー問題を解決しようとしています。問題の説明は次のとおりです。

3または5の倍数である10未満のすべての自然数をリストすると、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

私?への変更

(defn m? [x]
  (or (zero? (rem x 3))(zero? (rem x 5))))
于 2012-06-19T08:53:19.933 に答える
1

あなたはそれが与えた誤った答えを言いませんでしたが、問題は m? にあると思います:

(or (= 0 (rem x 3)) (= 0 (rem x 5)))
于 2012-06-19T02:44:47.463 に答える
0

数値が 3 の倍数か 5 の倍数かをチェックする関数が必要だったと思いますが、m?それは行われません。(rem x 3) または (rem x 5) のいずれかがゼロかどうかを確認する必要があります。

非常に大きな数についてこれを解くのは興味深い演習です。たとえば、3 または 5 の倍数である 10 億未満のすべての自然数の合計を見つけます。解は時間的に線形ですが、より高速な解を試すことができます。これは元の質問の一部ではありません。興味深い追加です。

于 2012-06-19T02:48:00.760 に答える