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