Bạn chuyển một chuỗi với một ký tự trong đó đến hàm make-str
của bạn, chứ không phải chính ký tự đó. Sử dụng first
thay vì take
sẽ cho bạn hiệu quả mong muốn.
Cũng không cần sử dụng tài liệu tham khảo. Trong thực tế việc bạn sử dụng chúng là một sự lạm dụng tổng thể của chúng. Bạn đã sử dụng bộ tích lũy trong chức năng của mình, vì vậy bạn có thể sử dụng trực tiếp str
.
(defn make-str-from-chars
"make a string from a sequence of characters"
([chars] (make-str-from-chars chars ""))
([chars result]
(if (zero? (count chars))
result
(recur (drop 1 chars) (str result (first chars))))))
Tất nhiên count
không phải là rất tốt đẹp trong trường hợp này, bởi vì nó luôn luôn phải đi bộ toàn bộ chuỗi để tìm ra chiều dài của nó. Vì vậy, bạn đi qua chuỗi đầu vào nhiều lần không cần thiết. Người ta thường sử dụng seq
để xác định thời điểm một chuỗi bị cạn kiệt. Chúng tôi cũng có thể sử dụng next
thay vì drop
để tiết kiệm một số chi phí tạo các đối tượng chuỗi không cần thiết. Hãy chắc chắn nắm bắt giá trị trả lại của seq
để tránh chi phí cho các sáng tạo đối tượng sau này. Chúng tôi làm điều này trong if-let
.
(defn make-str-from-chars
"make a string from a sequence of characters"
([chars] (make-str-from-chars chars ""))
([chars result]
(if-let [chars (seq chars)]
(recur (next chars) (str result (first chars)))
result)))
Chức năng như thế này, chỉ trả lại bộ tích lũy khi tiêu thụ đầy đủ đầu vào, khóc cho reduce
.
(defn make-str-from-chars
"make a string from a sequence of characters"
[chars]
(reduce str "" chars))
Điều này thật tuyệt và ngắn, nhưng trong trường hợp cụ thể này, chúng tôi có thể làm tốt hơn một chút bằng cách sử dụng apply
. Sau đó, str
có thể sử dụng toàn bộ số StringBuilder
cơ bản.
(defn make-str-from-chars
"make a string from a sequence of characters"
[chars]
(apply str chars))
Hy vọng điều này sẽ hữu ích.
Bạn mong đợi điều gì? – dm3
Tôi muốn (make-str-from-chars [\ u \ r \ a \ n \ u \ s]) trả lại "uranus" –
cho bản ghi cố gắng tránh lặp/lặp lại càng nhiều càng tốt, 99% thời gian bạn không cần nó. cố gắng suy nghĩ về bản đồ/giảm/áp dụng –