gpt4 book ai didi

loops - 无法通过逐个元素循环来更新向量

转载 作者:行者123 更新时间:2023-12-01 07:21:24 26 4
gpt4 key购买 nike

我正在尝试通过循环将向量的每个元素设置为等于 3。我得到:

java.lang.ClassCastException: clojure.lang.PersistentVector 可以
不被强制转换为 java.lang.Number

这是代码。

(def w [1 2 3])
(defn update [index value]
(assoc w index value))

(loop [i -1]
(if (< (count w) i)
w
(recur (update (+ i 1) 3))))

最佳答案

您的更新功能无法按您预期的方式工作。

(assoc w index value)

基于 w 生成一个新向量,除了 index 处的元素现在是 value。它 不会改变 w .
user> (def w [1 2 3])
user> (assoc w 0 9)
[9 2 3]
user> w
[1 2 3]

此外,您没有正确使用循环/递归。您从 i 绑定(bind)到 -1 开始循环,打算将其用作 w 的索引,但 recur 不是使用 i 的下一个值调用循环,而是使用 update 返回的 w 的更改副本。

尝试更多类似的东西:
(def w [1 2 3])
(loop [i 0, v w]
(if (< (count w) i)
v
(recur (inc i) (assoc v i 3))))

但是,由于您实际上并未使用索引来计算元素的新值,因此您可以使用 map 而不是循环。由于只是将每个元素设置为常量值而不考虑其旧值,因此您可以不断使用 clojure 的内置函数。
(vec (map (constantly 3) w))

Map 返回一个序列,我将其包装在对 vec 的调用中,以将其转换回向量。

关于loops - 无法通过逐个元素循环来更新向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594641/

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