Разве хвостовая рекурсивная функция не должна быть быстрее?

] У меня есть следующий код 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) и повторяется с использованием уловки для достижения этой цели?

Спасибо.

5
задан Balint Erdi 9 January 2011 в 13:09
поделиться