rekursi clojure membuat daftar

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

Untuk kode ini hasilnya [5 4 3 2 1] Kenapa tidak [1,2,3,4,5]? Saya melihat kita melakukan conf dari hasil panggilan foo rekursif dengan sebuah nilai. Karena menurutku seharusnya 1 2 3 4 5? Butuh bantuan untuk memahami hal ini. Terima kasih.


person BufBills    schedule 03.08.2015    source sumber


Jawaban (2)


Dari dokumentasi conj:

clojure.core/conj
([coll x] [coll x & xs])
conj[oin]. Mengembalikan koleksi baru dengan xs
'ditambahkan'. (conj nihil item) mengembalikan (item). 'Penambahan' mungkin
terjadi di 'tempat' yang berbeda tergantung pada jenis betonnya.

Kondisi penghentian fungsi Anda menghasilkan nil, karena pengujiannya adalah kapan. Jadi panggilan konj terdalam adalah:

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

Yang selanjutnya:

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

Jadi hasil Anda akan menurun karena conj ditambahkan di depan daftar. Jika Anda menginginkannya dalam urutan menaik, mulailah dengan vektor kosong seperti ini:

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

Panggilan rekursif diperluas ke

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

Implisit nil dikembalikan oleh (foo 0) permainan kata-kata ke ().

person Thumbnail    schedule 03.08.2015