Memoize не работает для примера Фибоначчи - PullRequest
0 голосов
/ 10 июня 2018
(time (fib 30))
;; "Elapsed time: 8179.04028 msecs"

;; Fibonacci number with recursion and memoize.
(def m-fib
  (memoize (fn [n]
             (condp = n
               0 1
               1 1
               (+ (m-fib (dec n)) (m-fib (- n 2)))))))

(time (m-fib 30))
;; "Elapsed time: 1.282557 msecs"

Это пример кода из https://clojuredocs.org/clojure.core/memoize,, но когда я запускаю его в своем браузере, время совсем не меняется.Мне интересно, почему это так?enter image description here

1 Ответ

0 голосов
/ 10 июня 2018

Я не знаю, какой REPL на основе браузера вы используете, но в левом столбце показан результат вызова функции, а не время, поэтому оба значения одинаковы.Обе функции вычисляют одно и то же число Фибоначчи.

Макрос time предназначен для переноса произвольных выражений без изменения структуры кода, поэтому он возвращает то же значение, которое возвращается упакованным выражением, и печатаетВремя выполнения вычеркнуть.По сути, выражение (time (m-fib 30)) расширено до

(let [start (. System (nanoTime))
      ret (m-fib 30)]
  (println (str "Elapsed time: " (/ (double (- (. System (nanoTime)) start)) 1000000.0) " msecs"))
  ret)

Так что, чтобы увидеть время выполнения в вашем REPL, вам нужно увидеть распечатанный вывод выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...