2017-10-19 194 views
1

我不知道如何完成這項工作,也許有人可以幫助我?我想做這樣的事情:將元素添加到嵌套矢量

vector<int> L[MAX_V]; 
for(int i=1;i<N;++i){ 
    scanf("%d %d",&u,&v); 
    --u; --v; 
    L[u].push_back(v); 
    L[v].push_back(u); 
} 

,但在clojure語言。到目前爲止,我已經配備了這樣的事情,但它不工作:

(defn LoadTree [] 
    (def n (read-string (read-line))) 
    (def tree (atom (into [] (repeat n [])))) 
    (loop [x n] 
    (when (> x 1) 
     (let [input (read-string (str "[" (read-line) "]"))] 
     (swap! (get @tree (dec (get input 0))) conj (dec (get input 1))) <-Error 
     (swap! (get @tree (dec (get input 1))) conj (dec (get input 0))) <-Error 
     (recur (dec x)) 
    ) 
    ) 
) 
+0

'交換'應該在樹直接工作(不@tree)。然後看看使用函數族中的一個:'assoc','assoc-in','update','update-in'。 –

+1

另外,它需要說:不要在這裏使用'def'!使用'let'來創建本地綁定。 – Carcigenicate

+0

另請注意,您嘗試重現的代碼使用可變對象。你不應該試圖直接複製這些代碼,而應該試圖利用不變的想法。原子和地方定義是「核選項」,你在這裏使用兩者。如果沒有更多的上下文,你很難確切地說出你應該怎麼寫。 – Carcigenicate

回答

1

我會寫這樣的事情:

(defn foo [num-reads size] 
    (loop [i num-reads, r (vec (repeat size []))] 
    (if (zero? i) 
     r 
     (let [[u v] (repeatedly read)] 
     (recur (dec i), (-> r (update u conj v) (update v conj u)))))))