2012-06-19 2 views
0

Я пытаюсь решить проблему Project Euler в Clojure, используя рекурсию. Ниже приводится постановка задачи:Решение проекта Euler 1

Если мы все натуральные числа меньше 10, кратные 3 или 5 , мы получаем 3, 5, 6 и 9. Сумма этих мультипликаторов составляет 23.

Найти сумму всех чисел, кратных 3 или 5 ниже 1000.

Однако приведенный ниже код, кажется, дает неправильный ответ. Что я делаю не так?

(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) 

ответ

1

Вы не сказали, что ошибочный ответ он давал, но я считаю, что проблема заключается в м ?:

(or (= 0 (rem x 3)) (= 0 (rem x 5))) 
0

Я думаю, что вы хотели функцию m?, чтобы проверить, является ли число кратным 3 или 5. Но это не так. Вы должны проверить, нет ли нуля (rem x 3) или (rem x 5).

Это интересное упражнение для решения этого вопроса для очень больших чисел. Например, найдите сумму всех натуральных чисел ниже 1 миллиарда, которые кратно 3 или 5. Ваше решение линейно во времени, но вы можете попытаться найти решение быстрее. Это не часть вашего первоначального вопроса; просто интересное дополнение к нему.

1

m? изменить на

(defn m? [x] 
    (or (zero? (rem x 3))(zero? (rem x 5)))) 
Смежные вопросы