Sto provando a lavorare con il libro di programmazione Clojure di Stuart Halloway. Tutta questa roba funzionale è molto nuova per me.Qual è la differenza tra la funzione Clojure (nth [coll index]) e la composizione (last (take index coll))
Capisco come
(defn fibo[]
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))
genera la sequenza di Fibonacci pigramente. Non capisco il motivo per cui
(last (take 1000000 (fibo)))
opere, mentre
(nth (fibo) 1000000)
genera OutOfMemoryError. Qualcuno potrebbe spiegare come queste due espressioni differiscono? È (ennesimo) in qualche modo aggrappato al capo della sequenza?
Grazie!
Nessuno di questi lavori per me su tryclj.com dato che il numero è così grande da causare un overflow. AFAICT non tieni alcun riferimento a qualcosa, quindi non credo che nulla sia "trattenuto sulla testa". Sei sicuro che non è solo perché il numero è così stravolgente? –
L'implementazione dell'ultima è un'attuazione ricorsiva in avanti di tipo O (n), e non regge a nulla. nth è implementato in Java e sono abbastanza sicuro che non trattiene nulla. Pertanto, entrambe le sequenze dovrebbero funzionare bene (in teoria). L'unica cosa a cui riesco a pensare, anche se non sono chiaro su questo influenza il risultato, è che la tua ennesima chiamata calcola effettivamente 1 oggetto in più rispetto alla tua ultima chiamata. n ° 1000000 = 1000001st oggetto (0 indicizzazione) – vedang
@vedang Grazie ... Non avrei catturato quell'importante distinzione. Non era la fonte del mio problema, anche se non mi ero reso conto che l'argomento da prendere fosse la dimensione della sequenza, mentre l'argomento di ennesima era l'indice. – Josh