如何在clojure中维护2d向量的单个副本
我想在全班维护vector的一个副本。我必须在递归中多次更新向量如何在clojure中维护2d向量的单个副本,clojure,Clojure,我想在全班维护vector的一个副本。我必须在递归中多次更新向量 ;this is to update cell in vector (defn to-plus [data x y] (update data y (fn [row] (apply str (assoc (vec row) x \+))))) ;here i am getting values in board and calling to-plus to update board ;now i need to mainta
;this is to update cell in vector
(defn to-plus [data x y]
(update data y (fn [row] (apply str (assoc (vec row) x \+)))))
;here i am getting values in board and calling to-plus to update board
;now i need to maintain a single copy of board
(let [board (read-in-board "map.txt")]
(print-maze board)
(println(str (get-in board [1 4])))
(print-maze (to-plus board 1 4))
(println(to-plus board 1 4)))
我试图用递归和随机游走来解决迷宫问题。我对Clojure不熟悉
;Data is of type
---#--###----
-#---#----##-
####-#-#-#-##
---#---#-#---
-+-####---##-
-#------#----
-############
------------@
使用to-array-2d,然后使用aget和aset
以上答案已被L.F.否决,并在下面添加了更多细节:
“…维护向量的单个副本…”
Ans:使用to-array-2d将不可变嵌套向量转换为可变2d数组
“…在递归中多次更新向量…”
Ans:使用aget和aset读取和更新创建的可变2d数组。如果需要更新紧循环中的某些内容,可以使用瞬态向量。它们被设计为从单个Java线程变异而来,并在从函数返回之前转换为持久数据结构。它们纯粹是针对持久向量的性能优化。首先让你的算法工作,然后引入瞬变使其更快。正如其他人已经回答的那样,Clojure向量是不可变的。你有几个选择 使用瞬态向量。 使用原子。 使用瞬态,您的代码将如下所示
(let [maze (transient [\* \* \* \*])]
(assoc! maze
1
\#)
(prn (persistent! maze)))
(let [maze (atom [\* \* \* \*])]
(prn @maze)
(swap! maze
assoc
1
\#)
(prn @maze))
使用atom,您的代码将如下所示
(let [maze (transient [\* \* \* \*])]
(assoc! maze
1
\#)
(prn (persistent! maze)))
(let [maze (atom [\* \* \* \*])]
(prn @maze)
(swap! maze
assoc
1
\#)
(prn @maze))
这张照片
=> [\* \* \* \*]
=> [\* \# \* \*]
请注意,当使用原子时,内部向量仍然是不可变的。每次都要用新向量交换向量。因此,如果性能是您唯一关心的问题,请使用transient
如果要更新深度嵌套的结构,请查看中的assoc。不行。Clojure向量是不可变的。您可以使用Java样式的数组。Clojure具有以下帮助函数:[make array][可以制作您想要的。您可以使用aget和某种形式的aset操纵arrray。。。。