Я запускаю Project Euler для изучения Clojure.
Цель этой функции - вычислить lcm набора целых чисел от 1
до m
.
(lcm 10)
возвращает 2520
Это довольно грубый способ сделать это. Теоретически мы проходим каждое число от m
до бесконечности и возвращаем первое число, для которого все значения 1
через m
равномерно делят это число.
Если я понимаю, что "ленивый" означает правильно (и если я действительно ленив здесь), тогда это должно работать в постоянном пространстве. Нет необходимости хранить больше, чем список чисел от 1
до m
и 1 значение от бесконечного набора чисел, которые мы перебираем.
Я получаю java.lang.OutOfMemoryError: Java heap space
при m
значениях больше 17.
(defn lcm [m]
(let [xs (range 1 (+ m 1))]
(first (for [x (iterate inc m) :when
(empty?
(filter (fn [y] (not (factor-of? y x))) xs))] x))))
Спасибо!