2009-11-24 36 views
39

Điều gì sẽ là một cách thành ngữ để đại diện cho một cây trong Clojure? Ví dụ:Đại diện cho một cây trong Clojure

 A 
    /\ 
    B C 
    /\ \ 
D E F 

Hiệu suất không quan trọng và cây sẽ không phát triển quá 1000 yếu tố.

+27

WTF là sai với bạn mọi người, mỗi khi ai đó không thích những câu hỏi họ đạt gần. stackoverflow là một nơi rất tốt để tìm hiểu một cái gì đó bây giờ nó đã chuyển sang digg, với rất nhiều kẻ ngốc. Nếu bạn không thích câu hỏi đó là những gì bỏ phiếu xuống là dành cho. –

+4

Họ đã bỏ phiếu để đóng nó, vì đó là một bản sao chính xác. – Rayne

+1

Đồng ý; đây không phải là về * thích * câu hỏi; như bạn nói đang học lại điều gì đó - có lẽ học hỏi từ lần cuối cùng ai đó hỏi cùng một câu hỏi? –

Trả lời

30
'(A (B (D) (E)) (C (F))) 
5

Có một cách đáng sợ để làm việc đó chỉ sử dụng cons:

(defn mktree 
    ([label l r] (cons label (cons l r))) 
    ([leaf] (cons leaf (cons nil nil)))) 
(defn getlabel [t] (first t)) 
(defn getchildren [t] (rest t)) 
(defn getleft [t] (first (getchildren t))) 
(defn getright [t] (rest (getchildren t))) 

Lưu ý rằng trẻ em không phải là một danh sách; đó là một cặp. Nếu cây của bạn không chỉ là nhị phân, bạn có thể biến nó thành một danh sách. sử dụng nil khi không có con trái hoặc phải, tất nhiên.

Nếu không, hãy xem this answer.

Cây trong hình ảnh của bạn:

(mktree 'A (mktree 'B (mktree 'D) (mktree 'E)) (mktree 'C nil (mktree 'F))) 
+1

nó có đầu tiên và phần còn lại thay cho cdr xe hơi –

+0

cảm ơn;) lisp phổ biến có cả hai. tôi sẽ chỉnh sửa. nó có 'khuyết điểm' mặc dù? –

+0

Tôi nghĩ bạn nên chỉnh sửa nó để nói "Tôi chỉ biết chung lisp". Lisp thường không phải là 'Lisp'. Đó là * a * Lisp. – Rayne

3

Trees underly chỉ là về tất cả mọi thứ trong Clojure vì họ cho vay mình rất độc đáo để chia sẻ cấu trúc trong cấu trúc dữ liệu liên tục. Bản đồ và Vectors thực sự là những cây có yếu tố phân nhánh cao để cung cấp cho chúng tra cứu và chèn thời gian. Vì vậy, câu trả lời ngắn nhất tôi có thể cho (mặc dù nó không thực sự hữu ích) là tôi thực sự khuyên bạn nên Purely functional data structures by Chris Okasaki cho một câu trả lời thực sự cho câu hỏi này. Ngoài ra đoạn video Giàu Hickey về cấu trúc dữ liệu Clojure trên blip.tv

(set 'A 'B 'C) 
Các vấn đề liên quan