繁体   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