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

How to correctly paste parenthesis in scheme?

我不明白为什么我这样做:

(cons (list 1 2) (list 3 4))

我明白了

((1 2) 3 4) , but not a ((1 2) (3 4))

         .__4
        / \
       .  3
      / \
     1   2`

这是一棵三元树。 Left child - 有两个叶子的二叉树。中右child就是一片树叶

我想我有 ((1 2) (3 4)) 和带有两个 child 的二叉树(每个都是二叉树))。

那为什么SICP (page 103)作者画的图是三叉树而不是二叉树呢?

当用于构建列表时,(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画三叉树的原因是它表示树,这样每个列表表示一个节点,其中每个元素都是一个child。因此,一个包含三个元素的列表(例如 (1 2 (3 4)))是一个具有三个 children 的节点:两个叶子和一个具有两个 children(两个叶子)的子树。

让我们使用这个翻译:

(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)  =   /|\
                          / 4   
                          1 2

由于示例中没有空列表,我们不使用 .在图中。

简而言之:SICP中的符号不​​能用于绘制由consempty构建的一般数据结构。