If we have tree recursive procedure such as the follows, how can we
use memoize it so that it automatically caches the values it has
already computed .....
(defn fib [n]
(println "Calling fib with arg --> " n)
(cond
(= n 0) 0
(= n 1) 1
:else (+ (fib (- n 1))
(fib (- n 2)))))
I changed the source for memoize - added two print statements
(defn memoize
"Returns a memoized version of a referentially transparent function.
The
memoized version of the function keeps a cache of the mapping from
arguments
to results and, when calls with the same arguments are repeated
often, has
higher performance at the expense of higher memory use."
{:added "1.0"}
[f]
(let [mem (atom {})]
(fn [& args]
(println "Calling memoized fn with args ->" args)
(if-let [e (find @mem args)]
(do (println "taking from cache"(val e) )(val e) )
(let [ret (apply f args)]
(swap! mem assoc args ret)
ret))) ))
Now memoizing and calling the function .....
(defn m-fib (memoize fib))
In this case, the INTERMEDIATE values the function computes are NOT
stored in the memoize cache.
The only way I can think of of utilizing the memoize function as such
is as follows:
(defn fib2 [my-fun n]
(println "Calling fib with arg --> " n)
(cond
(= n 0) 0
(= n 1) 1
:else (+ (my-fun my-fun (- n 1))
(my-fun my-fun (- n 2)))))
(def m-fib2 (memoize fib2))
(m-fib2 m-fib2 10)
--------------------------------------------------------------------------------
Maybe memoize should go the same way as the contrib trace package -
i.e, have special macros. "Functional" memoizing can only cover so
much .........
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en