Я пытаюсь научить себя замыканию и для этого использую принципы Prime Factors Kata и TDD.
Через серию тестов Midje, таких как:
(fact (primefactors 1) => (list))
(fact (primefactors 2) => (list 2))
(fact (primefactors 3) => (list 3))
(fact (primefactors 4) => (list 2 2))
Мне удалось создать следующую функцию:
(defn primefactors
([n] (primefactors n 2))
([n candidate]
(cond (<= n 1) (list)
(= 0 (rem n candidate)) (conj (primefactors (/ n candidate)) candidate)
:else (primefactors n (inc candidate))
)
)
)
Это прекрасно работает, пока я не брошу на него следующий краевой тест:
(fact (primefactors 1000001) => (list 101 9901))
Я получаю ошибку переполнения стека. Я знаю, что мне нужно превратить это в правильные циклы повторения, но все примеры, которые я вижу, кажутся слишком упрощенными и указывают только на счетчик или числовую переменную в качестве фокуса. Как мне сделать это рекурсивным?
Спасибо!