Как я могу сохранить одну копию 2d вектора в clojure - PullRequest
0 голосов
/ 30 мая 2019

Я хочу сохранить одну копию вектора во всем классе.Я должен обновить вектор много раз в рекурсии.

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

Ответы [ 3 ]

0 голосов
/ 04 июня 2019

Если вам нужно что-то обновить в узком цикле, вы можете использовать переходный вектор. Документы здесь .Они предназначены для того, чтобы «мутировать» из одного потока Java и превращаться в постоянную структуру данных перед возвратом из вашей функции.Они являются просто оптимизацией производительности по постоянным векторам.Сначала заставьте ваш алгоритм работать, а затем введите переходные процессы, чтобы сделать его быстрее.

0 голосов
/ 05 июня 2019

Как уже отвечали другие, Clojure векторы неизменны. У вас есть несколько вариантов,

  1. Использовать переходный вектор.
  2. Используйте атом.

Используя переходный процесс, ваш код будет выглядеть так:

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

Используя атом, ваш код будет выглядеть так:

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

Это отпечатки,

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

Обратите внимание, что при использовании атома внутренний вектор остается неизменным. Вы меняете вектор новым вектором каждый раз. Так что, если производительность - ваша единственная проблема, используйте transient .

Если вы хотите обновить глубоко вложенную структуру (например, массив массивов), посмотрите на assoc-in.

0 голосов
/ 30 мая 2019

Используйте to-array-2d, затем aget и aset

ответ выше был получен голосом Л.Ф. Добавление более подробной информации ниже:

«... сохранить одну копию вектора ...» Ответ: Используйте to-array-2d для преобразования неизменяемого вложенного вектора в изменяемый 2d массив.

«... многократно обновлять вектор в рекурсии ...» Ответ: Используйте aget и aset для чтения и обновления созданного изменяемого 2d массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...