Tôi đang cố gắng làm việc qua cuốn sách Lập trình Clojure của Stuart Halloway. Toàn bộ công cụ chức năng này rất mới mẻ đối với tôi.Sự khác biệt giữa hàm Clojure (nth [coll index]) và thành phần (last (take index coll))
Tôi hiểu thế nào
(defn fibo[]
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))
tạo dãy Fibonacci uể oải. Tôi không hiểu tại sao
(last (take 1000000 (fibo)))
công trình, trong khi
(nth (fibo) 1000000)
ném một OutOfMemoryError. Ai đó có thể giải thích hai biểu thức này khác nhau như thế nào? Là (nth) bằng cách nào đó giữ cho người đứng đầu của trình tự?
Cảm ơn!
Cả hai đều không làm việc với tôi trên tryclj.com vì số lượng quá lớn gây ra tràn. AFAICT bạn không giữ một tham chiếu đến bất cứ điều gì vì vậy tôi không tin bất cứ điều gì là "giữ lên đầu". Bạn có chắc nó không chỉ vì số lượng lớn đến mức không thể tưởng tượng nổi? –
Việc thực hiện cuối cùng là một tiến thẳng tiến O (n) thực hiện đệ quy đuôi, và nó không giữ bất cứ điều gì. nth được thực hiện trong Java và tôi khá chắc chắn rằng nó không giữ bất cứ thứ gì. Do đó, cả hai trình tự của bạn sẽ hoạt động tốt (theo lý thuyết). Điều duy nhất tôi có thể nghĩ đến, mặc dù tôi không rõ ràng về điều này ảnh hưởng đến kết quả, là cuộc gọi thứ n của bạn thực sự tính toán 1 mục nhiều hơn cuộc gọi cuối cùng của bạn. nth 1000000 = 1000001st mục (0 đánh chỉ mục) – vedang
@vedang Cảm ơn ... Tôi sẽ không bắt được sự khác biệt quan trọng đó. Nó không phải là nguồn gốc của vấn đề của tôi, mặc dù tôi đã không nhận ra rằng đối số cần thực hiện là kích thước của chuỗi, trong khi đối số với thứ n là chỉ mục. – Josh