我不明白为什么我这么做:
(cons (list 1 2) (list 3 4))我得到了
((1 2) 3 4) , but not a ((1 2) (3 4))或
.__4
/ \
. 3
/ \
1 2`这是一棵三元树。左子二叉树有两片叶子。中间和右边的孩子只是一片叶子。
我假设我有带有两个子树的((1 2) (3 4))和二叉树(每个子树都是二叉树)。
那么,为什么预防犯罪中心(第103页)作者画的是三元树,而不是二叉树呢?
发布于 2016-04-17 19:40:17
让我们使用这个翻译:
(cons a b) = /\ and empty = .
a b首先,我们有两个清单:
(list 1 2) = (cons 1 (cons 2 empty)) = /\
1 /\
2 .
(list 3 4) = (cons 3 (cons 4 empty)) = /\
3 /\
4 .在这两个列表上使用cons提供:
(cons (list 1 2) (list 3 4)) = (cons (cons 1 (cons 2 empty))
(cons 3 (cons 4 empty)))
= / \
/\ /\
1 /\ 3 /\
2 . 4 .使用列表提供:
(list (list 1 2) (list 3 4)) = (cons (cons 1 (cons 2 empty))
(cons (cons 3 (cons 4 empty))
empty
= /\___
/\ /\
1 /\ /\ .
2 . 3/\
4 .在SICP第108页中,他们假设我们有一棵树表示为树的列表。也就是说:他们认为cons还没有被用来制作树。
他们使用的翻译是:
empty = .
(list a) = |
a
(list a b) = /\
a b
(list a b c) = /|\
abc他们的榜样
(list (list 1 2) 3 4) = /|\
/\3 4
1 2由于示例中没有空列表,所以我们不使用。在画里。
总之,SICP中的符号不能用于绘制用cons和empty构建的通用数据结构。
发布于 2016-04-17 08:49:42
当用于构建列表时,(cons x y)创建一个列表,其中x (可以是任何类型)作为它的第一个元素,y (必须是一个列表,结果必须是一个列表)作为它的其余元素。所以(cons 1 (list 3 4))给你(1 3 4),(cons (list 1 2) (list 3 4))给你((1 2) (3 4)),因为(1 2)只是列表的第一个元素。
如果希望结果是((1 2) (3 4)),则编写(list (list 1 2) (list 3 4))而不是使用cons。
SICP绘制三元树的原因是它表示树,因此每个列表代表一个节点,其中每个元素都是子节点。因此,包含三个元素(如(1 2 (3 4)))的列表是一个有三个子元素的节点:两个叶和一个子树,两个子树(都是叶)。
https://stackoverflow.com/questions/36673716
复制相似问题