[英]Different rules for cons arguments?
我是球拍語言的新手,遇到了一個問題。 我現在正在嘗試使用cons(list)實現Binary Search Tree。
這是我嘗試制作的簡單BST:
對於此BST,如果將其轉換為球拍列表,則可能是一種可能性:'(6,(4,(),()),(7,(),())
為了產生這種列表格式,我使用了以下代碼:
(define x3 (cons 6 (cons (cons 4 (cons null (cons null null)))
(cons 7 (cons null (cons null null)))
對於此代碼,結果如下:
'(6 (4 () ()) 7 () ())
如您所見,這不是我想要的。 第二個子節點7()()不在括號內,這意味着它不作為列表存在。 它充當單獨的3個元素,而不是單個列表。 所以我改變了一點:
(define x2 (cons 6 (cons (cons (cons 4 (cons null (cons null null))) null)
(cons (cons 7 (cons null (cons null null))) null)
)
)
)
對於第二個代碼,結果如下:
'(6 ((4 () ())) (7 () ()))
這也不是我想要的。 現在,第一個子節點((4()()))在列表的內部和內部。 所以我做了最后的嘗試,代碼是這樣的:
(define x3 (cons 6 (cons (cons 4 (cons null (cons null null)))
(cons (cons 7 (cons null (cons null null))) null)
)
)
)
結果看起來像這樣:
'(6 (4 () ()) (7 () ()))
現在可以了! 問題是,為什么這些事情會發生? 我有點意識到使用cons時list的最后一個元素與另一個元素之間的規則是不同的,但是畢竟,它們不是同一類型的list嗎?
當使用cons
編寫深列表列表時,很容易忘記內部列表的開始位置或結束位置等。因此,如果您要手工寫一個長列表,則可能更容易只需使用list
:
(list 6 (list 4 null null) (list 7 null null))
否則,您也可以通過從內到外的方式輕松構建自己的cons
列表。 例如,在您的BST中,有兩個葉節點和一個根父節點。 因此,您可以從葉節點開始:
(define left (cons 4 (cons null (cons null null))))
(define right (cons 7 (cons null (cons null null))))
那么BST變為:
(cons 6
(cons left
(cons right null)))
等效於:
(cons 6
(cons (cons 4 (cons null (cons null null)))
(cons (cons 7 (cons null (cons null null))) null)))
首先:
cons
實際上創建了一個單元格,即一個cons單元格。 您可以使用cons將多個cons單元相互附加。
(cons 'a 'b) ;; (a . b)
(cons 'c (cons 'a 'b)) ;; (c . (a . b))
Lisp表示法為'。 ('為'',因此最后一個示例簡化為:
(c a . b)
什么是清單? 這樣的缺點細胞或缺點細胞鏈,最后一個元素為'。 ()”。 在這種情況下,您可以使其不可見。
(cons 'c (cons 'a null)) ;; or
(cons 'c (cons 'a 'null)) ;; or
(cons 'c (cons 'a '())) ;; which are the same!
;; in common lisp even (cons 'c (cons 'a ())) in addition
因此簡化為:
(c a) ;; actually (c . (a . null))
這些語法簡化規則以及cons僅使用精確的2個參數,但二進制樹需要3個插槽的事實,使得cons構造比問題乍一看更復雜。
您的BST應該表示為以下列表:
(list 6 (list 4 null null) (list 7 null null))
僅手動使用conses就已經非常復雜...(如assefamaru所述)
如您所見, list
是cons嵌套的最抽象,cons嵌套具有最里面的cons-單元cons為null,並且更適合語法的簡化規則。 因此對大腦更友好。
但更優雅的是,您應該通過定義每個節點都希望使用結構來使用結構(如此處https://learningtogetolder.wordpress.com/2013/08/14/creating-a-binary-search-tree-in-racket/所述 )值以及左節點和右節點。 因此,使構造錯誤成為不可能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.