การเรียกซ้ำของ Clojure รวบรวมรายการ

((fn foo [x] (when (> x 0) (conj (foo (dec x)) x))) 5)

สำหรับโค้ดนี้ ผลลัพธ์คือ [5 4 3 2 1] เหตุใดจึงไม่เป็น [1,2,3,4,5] ฉันเห็นว่าเรา conf จากผลลัพธ์ของการเรียก foo แบบเรียกซ้ำด้วยค่า เพราะผมคิดว่าควรจะเป็น 1 2 3 4 5? ต้องการความช่วยเหลือเพื่อทำความเข้าใจสิ่งนี้ ขอบคุณ.


person BufBills    schedule 03.08.2015    source แหล่งที่มา


คำตอบ (2)


จากเอกสารของ conj:

clojure.core/conj
([coll x] [coll x & xs])
conj[oin]. ส่งกลับคอลเลกชันใหม่ด้วย xs
'added' (conj ไม่มีรายการ) ส่งคืน (รายการ) 'การเติม' อาจ
เกิดขึ้นใน 'สถานที่' ที่แตกต่างกัน ขึ้นอยู่กับประเภทของคอนกรีต

เงื่อนไขการสิ้นสุดของฟังก์ชันของคุณจะให้ผล nil เนื่องจากการทดสอบคือเมื่อใด ดังนั้นการโทร conj ที่ลึกที่สุดจะเป็น:

(conj nil 1)
(1) <-- a list

อันถัดไป:

(conj (conj nil 1) 2)
(2 1)

ดังนั้นผลลัพธ์ของคุณจะเรียงลำดับลดลงเนื่องจาก conj ต่อท้ายรายการ หากคุณต้องการให้มันเรียงลำดับเพิ่มขึ้น ให้เริ่มต้นด้วยเวกเตอร์ว่างดังนี้:

((fn foo [x] (if (> x 0) (conj (foo (dec x)) x) [])) 5)
[1 2 3 4 5]
person Diego Basch    schedule 03.08.2015

การเรียกซ้ำจะขยายเป็น

(conj (conj (conj (conj (conj nil 1) 2) 3) 4) 5)
;(5 4 3 2 1)

nil โดยนัยส่งกลับโดย (foo 0) เล่นเป็น ()

person Thumbnail    schedule 03.08.2015