如何在方案中正确粘贴括号?

时间:2016-04-17 07:15:29

标签: scheme

我不明白为什么这样做:

(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)作者画一张三元树而不是二叉树?

2 个答案:

答案 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中的符号不​​能用于绘制使用consempty构建的常规数据结构。