Tôi gặp StackOverflowError cho đoạn mã sau:java.lang.StackOverflowError trong clojure đuôi đệ quy
(defn recursive-reverse
([coll] (recursive-reverse [coll nil]))
([coll acc]
(if (= coll '()) acc
(recur (rest coll) (cons (first coll) acc)))))
mặc dù sử dụng vòng lặp sẽ làm cho nó hoạt động:
(defn recursive-reverse [lst]
(loop [coll lst acc nil]
(if (= coll '()) acc
(recur (rest coll) (cons (first coll) acc)))))
gì đi sai với mã trước không có vòng lặp?
Cảm ơn. Tinh thể rõ ràng bây giờ. – lkahtz
'(nil? X)' có thể nhanh hơn '(= x())', bởi vì trình biên dịch có thể phát ra chỉ một hoạt động bytecode đơn, kiểm tra null nguyên thủy mà Java sử dụng. Tất nhiên, sau này là khá nhanh, nhưng tôi nghi ngờ nó là nhiều lần chậm hơn so với trước đây. Khi điều đó xảy ra, kiểm tra nil được tối ưu hóa này chưa được thực hiện (nhưng?), Nhưng đó là một tối ưu hóa hợp lý có thể được thực hiện sau cùng. – amalloy