我不明白为什么这样做:
(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))
和带有两个孩子的二叉树(每个孩子都是二叉树))。
那么为什么SICP (page 103)作者画一张三元树而不是二叉树?
答案 0 :(得分:1)
当用于构建列表时,(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))
)是一个包含三个子节点的节点:两个叶子和一个带有两个子节点的子树(两个叶子)。
答案 1 :(得分:1)
让我们使用这个翻译:
(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 (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
构建的常规数据结构。