SICP中Lisp树结构表达式疑问:cons与list组合结果解析
问题解答
为什么输出是((1 2) 3 4)而不是((1 2) (3 4))
要搞清楚这个问题,得先明确Scheme里cons和list的核心区别:
list a b c本质是语法糖,等价于(cons a (cons b (cons c '()))),它会生成一个proper list(即每个cdr要么是另一个proper list,要么是空表'())。cons x y则是直接构造一个序对(pair),把x作为这个序对的car,y作为cdr——不管y是不是一个list。
回到你的代码:
(list 1 2)生成的结构是(1 . (2 . ())),打印为(1 2);(list 3 4)生成的结构是(3 . (4 . ())),打印为(3 4);(cons (list 1 2) (list 3 4))的结果是把(list 1 2)作为car,(list 3 4)作为cdr,也就是结构((1 2) . (3 . (4 . ())))。
Scheme在打印proper list时,会自动展开cdr里的嵌套序对,用空格分隔元素,所以这个结构就被打印成了((1 2) 3 4)。
如果你想要得到((1 2) (3 4)),应该用(list (list 1 2) (list 3 4))——因为list会把每个参数作为独立元素,构造出(cons (list 1 2) (cons (list 3 4) '())),对应的打印结果就是你预期的包含两个子list的list。
该表达式是否唯一对应树结构?
是的,这个表达式对应的树结构是唯一的。
在SICP的树模型中:
- 原子(比如1、2、3、4)是树的叶子节点;
- 序对(由
cons构造)是树的非叶子节点,它的car对应左子树,cdr对应右子树。
(cons (list 1 2) (list 3 4))对应的树结构可以拆解为:
- 根节点是一个序对,左子树是
(1 2)(另一个序对:左子树1,右子树是序对(2, 空)); - 根节点的右子树是
(3 4)(序对:左子树3,右子树是序对(4, 空))。
因为Scheme里每个cons和list的构造都是确定的,没有歧义,所以这个表达式对应的树结构是唯一的。
内容的提问来源于stack exchange,提问作者Mark Dong
相关产品推荐
相关产品推荐

