Ваши результаты удивительны: обычно цикл / рекурсия - самая быстрая конструкция в Clojure для циклов.
Я подозреваю, что JVM JIT разработал умную оптимизацию для метода итерации, но не для цикла /рекурсивная версия.Удивительно, как часто это происходит, когда вы используете чистый функциональный код в Clojure: кажется, что он очень пригоден для оптимизации.
Обратите внимание, что вы можете существенно ускорить обе версии, явно указав double:
(set! *unchecked-math* true)
(defn sqrt [num]
(loop [guess (double 1)]
(if (close num (* guess guess))
guess
(recur (double (avg guess (/ num guess)))))))
(time (dotimes [n 10000] (sqrt 10)))
=> "Elapsed time: 25.347291 msecs"
(defn sqrt2 [number]
(let [number (double number)]
(first (filter #(close number (* % %))
(iterate #(avg % (/ number %)) 1.0)))))
(time (dotimes [n 10000] (sqrt 10)))
=> "Elapsed time: 32.939526 msecs"
Как и ожидалось, версия loop / recur теперь имеет небольшое преимущество.Результаты для Clojure 1.3