簡體   English   中英

缺點論證的不同規則?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM