gpt4 book ai didi

clojure - 数学幂函数的惰性序列或递归?

转载 作者:行者123 更新时间:2023-12-04 22:37:47 27 4
gpt4 key购买 nike

作为练习,我实现了数学幂函数。一旦使用 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"

还有一次使用惰性序列:
(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"

您认为哪种实现方式更胜一筹?我真的不知道..(我会使用 recur 因为它更容易理解。)

我读到 lazy-seq 很快,因为它使用内部缓存。但是我在我的样本中看不到任何缓存的机会。我是否忽略了什么?

更新
我张贴了 sample 的时间。似乎 recur 在这里稍微快一点。

常规递归也不会太糟糕:
(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"

最佳答案

首先,通常的建议是选择the correct algorithm首先,稍后再考虑实现细节(如果您的代码实际上对性能如此敏感,或者可能用于对性能敏感的上下文)。

然后是审美考虑。 recur对我来说似乎更干净,只是因为这是解决问题的完全自然的方式。当它们以某种方式进入语义图片时,使用序列是有意义的,或者如果失败,则使代码更容易编写/理解/提高性能。这里没有任何类似的情况。

最后,我肯定会期待 recur总体上更快,如果仅仅是因为它避免了不必要的分配和 GC。初始时间支持这一点。这里确实没有机会从任何类型的缓存中受益,因为每当 power 时,您都会从头开始生成序列。被调用并且在返回后永远不会保留它。

关于clojure - 数学幂函数的惰性序列或递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2795587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com