] У меня есть следующий код Clojure для вычисления числа с определенным «факторизуемым» свойством. (что именно
(defn factor-9
([]
(let [digits (take 9 (iterate #(inc %) 1))
nums (map (fn [x] ,(Integer. (apply str x))) (permutations digits))]
(some (fn [x] (and (factor-9 x) x)) nums)))
([n]
(or
(= 1 (count (str n)))
(and (divisible-by-length n) (factor-9 (quot n 10))))))
Теперь я знаком с TCO и понимаю, что Clojure может обеспечить хвостовую рекурсию только в том случае, если об этом явно сказано с помощью ключевого слова recur
. Поэтому я переписал код, чтобы что (замена фактора-9 на рекурсивное единственное отличие):
(defn factor-9
([]
(let [digits (take 9 (iterate #(inc %) 1))
nums (map (fn [x] ,(Integer. (apply str x))) (permutations digits))]
(some (fn [x] (and (factor-9 x) x)) nums)))
([n]
(or
(= 1 (count (str n)))
(and (divisible-by-length n) (recur (quot n 10))))))
Насколько мне известно, у TCO есть двойное преимущество. Первое состоит в том, что он не использует стек так же интенсивно, как не хвостовой рекурсивный вызов, и, следовательно, не взорвать его на больших рекурсиях. Во-вторых, я думаю, что, следовательно, он быстрее, так как его можно преобразовать в цикл.
Теперь я ' Я сделал очень приблизительный тест и не увидел никакой разницы между двумя реализациями. Я ошибаюсь в своем втором предположении или это как-то связано с запуском на JVM (которая не имеет автоматической TCO) и повторяется
с использованием уловки для достижения этой цели?
Спасибо.