作为练习,我实现了数学幂函数.一旦使用recur:
(defn power [a n]
(let [multiply (fn [x factor i]
(if (zero? i)
x
(recur (* x factor) factor (dec i))))]
(multiply a a (dec n))))
user=> (time (dotimes [_ 10000] (power 2 512)))
"Elapsed time: 1839.406746 msecs"
Run Code Online (Sandbox Code Playgroud)
有一次使用lazy-seq:
(defn power [a n]
(letfn [(multiply [a factor]
(lazy-seq
(cons a (multiply (* a factor) factor))))]
(nth (multiply a a) (dec n))))
user=> (time (dotimes [_ 10000] (power 2 512)))
"Elapsed time: 2162.297827 msecs"
Run Code Online (Sandbox Code Playgroud)
您认为哪种实施方式更优越?我真的不知道..(我会使用复发,因为它更容易理解.)
我读到lazy-seq很快,因为它使用内部缓存.但我在样本中看不到缓存的任何机会.我忽略了什么吗?
更新
我发布了样本的时间.似乎复发在这里稍快一些.
定期递归也不会太糟糕:
(defn power [a n]
(if (== n 1)
a
(* a (power a (dec n)))))
user=> (time (dotimes [_ 10000] (power 2 512)))
"Elapsed time: 1877.34521 msecs"
Run Code Online (Sandbox Code Playgroud)