作爲練習,我實現了數學冪函數。一旦使用易復發:懶惰序列或重複數學功能函數?
(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"
一旦懶-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"
你認爲哪實現更勝一籌?我真的不知道..(我會用復發,因爲它更容易理解。)
我讀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"
您也可以使用'*''而不是'*'來避免整數溢出。 – omiel 2014-03-07 09:08:25