gpt4 book ai didi

clojure - 在 Clojure 循环中附加到数组

转载 作者:行者123 更新时间:2023-12-02 05:41:50 26 4
gpt4 key购买 nike

我正在尝试编写一个函数来将 0 到 50 之间的所有 3 和 5 的倍数相加,但 Clojure 似乎决定在我告诉它时不将正确的值添加到我的列表中。

(conj toSum counter) 形式应该将当前数字附加到 toSum 数组,并且当循环退出时 (reduce + toSum) 形式应该将数组中的所有内容加在一起。

就目前而言,当 reduce 函数被调用时,toSum 始终为空,因为 conj 函数没有按预期执行去做。我一定是在某个地方搞砸了我的逻辑,但我似乎无法弄明白。

(defn calculate [target]
(loop [counter target
toSum []]
(if (= 0 counter)
(reduce + toSum)
(if (or (= 0 (mod counter 3)) (= 0 (mod counter 5)))
(do (conj toSum counter)
(println toSum)
(recur (dec counter) toSum))
(recur (dec counter) toSum)))))

最佳答案

一种更实用和惯用的方法:

(defn multiple-of-3-or-5? [n]
(or (zero? (mod n 3)) (zero? (mod n 5))))

(defn calculate-functional [target]
(->> (range 1 (inc target))
(filter multiple-of-3-or-5?)
(apply +)))

->>是线程的最后一个宏,该宏采用第一个传递的形式(range 形式)并将其作为最后一项插入下一个形式(filter 形式)中采用这个新表单并将其作为最后一项插入 apply 表单中。所以这个宏将 calculate-functional 函数转换为:

(apply + (filter is-multiple-3-or-5?
(range 1 (inc target))))

在这种情况下,thread last 宏并不是一个巨大的改进,但是当您的“管道”中有更多步骤时使用 thread macros可以明显更容易阅读。

(range 1 (inc target)) 形式创建一个 seq在 REPL 中从 1 开始到 target 结束:

(range 1 10)
=> (1 2 3 4 5 6 7 8 9)

下一个表达式是(filter multiple-of-3-or-5?), filter保留谓词为真的序列元素。最后 (apply +) 使用 apply+ 应用于序列的所有元素。你也可以在这里使用(reduce +),我只是想展示非常有用的apply

关于clojure - 在 Clojure 循环中附加到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28288376/

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