Sto provando a invertire in modo ricorsivo una lista, ma sto ottenendo Can only recur from tail position
sulla corsa. Cosa significa esattamente e come può essere migliorato il mio codice in modo che funzioni?Clojure: si può ripetere solo dalla posizione di coda
(defn recursive-reverse [coll]
(loop [coll coll]
(if (< (count coll) 2) '(coll)
(conj (first coll) (recur (rest coll)))
)))
EDIT
uscita per soluzione di Oscar. Funziona per le liste ma non per i vettori?
user=> (= (recursive-reverse [1 2 3 4 5]) (recursive-reverse '(1 2 3 4 5)))
false
user=> (= '(1 2 3 4 5) [1 2 3 4 5])
true
user=> (recursive-reverse [1 2 3 4 5])
[1 2 3 4 5]
user=> (recursive-reverse '(1 2 3 4 5))
(5 4 3 2 1)
funziona in modo diverso per elenchi e vettori perché 'conj' funziona in modo diverso per entrambi. È più economico "aggiungere" l'elemento nella parte anteriore di un elenco e alla fine di un vettore. 'conj' esamina il tipo di collezione e la aggiunge nel modo più economico. Ad essere onesti, questo non mi è mai sembrato giusto, ma sono sicuro che Rich Hickey e gli altri sviluppatori di Clojure ci hanno pensato molto e hanno deciso che i pro superano ogni contro. – Gert
Affascinante. Immagino che la performance sia stata la loro proprietà numero uno per le operazioni di base, ma sì sembra strano. – Chris
Spot on, @Gert. Ho aggiornato la mia risposta, preferirei restituire la risposta corretta di un tipo diverso rispetto a una risposta errata se l'input è un vettore –