Насколько я могу судить, ваш код на самом деле ленив (в том смысле, что он не спешит с ответом ... ;-) - см. Ниже), однако он генерирует кучи на кучах на кучахмусора.Только учтите, что (lvm 17)
означает запрос более 1,2 миллиона ленивых операций фильтрации на (range 1 18)
.Я не могу воспроизвести вашу проблему нехватки памяти, но я предположительно предположил бы, что это может быть проблема с вашими настройками памяти и ГХ.
Теперь, хотя я понимаю, что ваш вопрос на самом деле не об алгоритмах,обратите внимание, что производство всего этого мусора, выполнение всех этих операций фильтрации и т. д. не только полностью разрушают сложность этого пространства, но и временную сложность.Почему бы не использовать настоящий алгоритм LCM?Как тот, который использует lcm(X) = gcd(X) / product(X)
для X
набора натуральных чисел.GCD может быть рассчитан с помощью алгоритма Евклида.
(defn gcd
([x y]
(cond (zero? x) y
(< y x) (recur y x)
:else (recur x (rem y x))))
([x y & zs]
(reduce gcd (gcd x y) zs)))
(defn lcm
([x y] (/ (* x y) (gcd x y)))
([x y & zs]
(reduce lcm (lcm x y) zs)))
С учетом вышесказанного, (apply lcm (range 1 18))
даст вам ваш ответ в короткие сроки.