Skip to content

Instantly share code, notes, and snippets.

@tnoda
Forked from plaster/memotest.clj
Last active December 11, 2015 01:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tnoda/4522922 to your computer and use it in GitHub Desktop.
Save tnoda/4522922 to your computer and use it in GitHub Desktop.
元は, @plaster による `memoize` を使ったメモ化再帰 (memotest.clj). オリジナルで atom を使っていたところを var に置きかえてみました (m-fib.clj).
(def ^:dynamic *m-fib*)
(defn fib
[n]
(let [fib* (memoize (fn
[x]
(if (< 1 x)
(+ (*m-fib* (dec x))
(*m-fib* (- x 2)))
1)))]
(binding [*m-fib* fib*]
(fib* n))))
(defn fib [n]
(let [a-fib (atom false)]
(reset! a-fib (memoize (fn [n] (if (< 1 n) (+ (@a-fib (- n 1)) (@a-fib (- n 2))) 1))))
(@a-fib n)
))
plaster@chloe:~/src/clojure-1.5.0-RC1> java -cp clojure-1.5.0-RC1.jar clojure.main
Clojure 1.5.0-RC1
user=> (defn fib [n]
(let [a-fib (atom false)]
(reset! a-fib (memoize (fn [n] (if (< 1 n) (+ (@a-fib (- n 1)) (@a-fib (- n 2))) 1))))
(@a-fib n)
))
#'user/fib
user=> (fib 60)
2504730781961
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment