【问题标题】:How can I maintain single copy of a 2d vector in clojure如何在 clojure 中维护 2d 矢量的单个副本
【发布时间】:2019-05-30 00:04:11
【问题描述】:

我想在全班维护一个向量副本。我必须在递归中多次更新向量。

 ;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 
---#--###----
-#---#----##-
####-#-#-#-##
---#---#-#---
-+-####---##-
-#------#----
-############
------------@

【问题讨论】:

  • 你不能。 Clojure 向量是不可变的。您可以使用 Java 风格的 数组。 Clojure 为这些提供了帮助函数: [make-array][clojuredocs.org/clojure_core/clojure.core/make-array] 可以制作您想要的东西。您可以使用aget 和某种形式的aset... 来操作数组。

标签: clojure


【解决方案1】:

如果您需要在紧密循环中更新某些内容,您可以使用瞬态向量。 Docs here。它们被设计为从单个 Java 线程“变异”,并在从您的函数返回之前转换为持久数据结构。它们纯粹是对持久向量的性能优化。先让你的算法工作,然后引入瞬态以使其更快。

【讨论】:

    【解决方案2】:

    正如其他人已经回答的那样,Clojure 向量是不可变的。你有几个选择,

    1. 使用瞬态向量。
    2. 使用原子。

    使用瞬态,您的代码将如下所示,

    (let [maze (transient [\* \* \* \*])]
      (assoc! maze
              1
              \#)
      (prn (persistent! maze)))
    

    使用原子,您的代码将如下所示,

    (let [maze (atom [\* \* \* \*])]
      (prn @maze)
      (swap! maze
             assoc
             1
             \#)
      (prn @maze))
    

    打印出来,

    => [\* \* \* \*]
    => [\* \# \* \*]
    

    请注意,当使用 atom 时,内部向量仍然是不可变的。您每次都将向量与新向量交换。因此,如果性能是您唯一关心的问题,请使用 transient

    如果您想更新深度嵌套的结构(想想数组的数组),请查看assoc-in

    【讨论】:

      【解决方案3】:

      使用to-array-2d,然后使用agetaset

      上面的答案被 L.F 否决。在下面添加更多细节:

      “...维护向量的单个副本...” Ans: 使用to-array-2d 将不可变的嵌套向量转换为可变的二维数组。

      “...在递归中多次更新向量...” Ans: 使用agetaset 来读取和更新创建的可变二维数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-12
        • 2023-01-16
        • 2016-04-25
        • 2018-09-29
        相关资源
        最近更新 更多