gpt4 book ai didi

loops - 如何将 Common Lisp 代码的循环部分翻译成 Clojure? ... 功能定位

转载 作者:太空宇宙 更新时间:2023-11-03 18:55:38 25 4
gpt4 key购买 nike

如何将这个有效的 Common Lisp (SBCL v.1.2.3) 代码的循环部分翻译成 Clojure (v.1.6)?工作了几个小时/几天却没有结果,我有点沮丧。我想我在某个地方没有得到这种功能定位......

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Unconditional Entropy
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; Probabilities
(setq list_occur_prob '()) ;; init

;; set probabilities for which we want to calculate the entropy
(setq list_occur_prob '(1/2 1/3 1/6)) ;;

;; Function to calculate the unconditional
;; entropy H = -sigma i=0,n (pi*log2(pi)
;; bits persymbol.
(setq entropy 0) ;; init
(setq entropy (loop for i in list_occur_prob
for y = (* (log_base2 i) i)
collect y
))
(setq entropy (* -1 (apply '+ entropy))) ;; change the sign

;; Print the unconditional entropy in bits per symbol.
(print entropy) ;; BTW, here the entropy is 1.4591479 bits per symbol.

最佳答案

在我们深入研究代码的 Clojure 等价物之前,您应该花一些时间来清理 Common Lisp 代码。使用 setq 的方式充其量被认为是糟糕的风格,最坏的情况下会导致未定义的后果:setq 旨在为变量赋值,但您的变量list_occur_probentropy 未定义(通过 defvar)。此外,这段代码看起来像是在分配全局变量(再次参见 defvar),它们是动态变量,按照惯例应该用耳罩标记,例如*熵*。

但是,对于这一小段代码,您也可以使用像这样通过 let 引入的局部非动态变量(警告,我没有任何 CL 或 Clojure 环境方便):

 (let ((list_occur_prob '(1/2 1/3 1/6)))
(loop for i in list_occur_prob
for y = (* (log_base 2 i) i)
collect y into acc
finally (return (* -1 (apply '+ acc)))))

有一些方法可以将 apply 子句优化到循环中:

(let ((list-occur-prob '(1/2 1/3 1/6)))
(- (loop for i in list-occur-prob
sum (* (log i 2) i))))

现在,Daniel Neal 已经向您展示了一个基于 map/reduce 的解决方案,这里是一个更接近原始循环结构的解决方案,使用递归方法:

 (defn ent-helper [probs acc]
(if (seq probs)
(recur (rest probs)
(conj acc (* (log_base 2 (first probs)) (first probs))))
acc))

(let [probs 1/2 1/3 1/6
acc (ent-helper probs [])]
(* -1 (apply + acc))

我们使用 conj 而不是 collect 将结果收集到累加器中。对 ent-helper 的调用,本质上是通过 recur 递归调用为 probs 的所有值触发的,需要(最初为空)一秒收集到目前为止建立的值的参数。如果我们用尽了所有概率,我们只需返回收集到的值。

同样,可以将到目前为止的值相加优化到循环中,而不是映射值。

关于loops - 如何将 Common Lisp 代码的循环部分翻译成 Clojure? ... 功能定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27504659/

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