2017-10-19 42 views
1

Je ne sais pas comment faire, peut-être que quelqu'un pourrait m'aider? Je voudrais faire quelque chose comme ceci:Ajouter un élément à un vecteur imbriqué

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); 
} 

, mais en langage clojure. Jusqu'à présent, je suis venu avec quelque chose comme ça, mais il ne fonctionne pas:

(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

'échange' devrait travailler directement sur l'arbre (non @tree). Regardez ensuite en utilisant un de la famille de fonctions: 'assoc',' assoc-in', 'update',' update-in'. –

+1

Aussi, il faut le dire: n'utilisez pas 'def' ici! Utilisez 'let' pour créer des liaisons locales. – Carcigenicate

+0

Notez également que le code que vous essayez de reproduire utilise des objets mutables. Au lieu d'essayer de reproduire directement ce code, vous devriez essayer de faire usage de la pensée immuable. Les atomes et les défs locaux sont des «options nucléaires», et vous utilisez les deux ici. Il serait difficile de dire exactement comment vous devriez écrire ceci sans un peu plus de contexte. – Carcigenicate

Répondre

1

Je voudrais écrire quelque chose comme ceci:

(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)))))))