来自SICP
练习2.24:假设我们评估表达式(列表1(列表2(列表3 4)))。给出解释器打印的结果,相应的box-and-pointer结构,并将其解释为树(如图2.6所示)。
问题是我的眼睛被摧毁了,因此我既看不到框和指针图也没有看到图2.6。所以现在我只猜测这个列表应该是什么样的树基于:
另一种思考其元素是序列的序列的方法是树。序列的元素是树的分支,本身序列的元素是子树。
请检查我的树解释。这只是我的想象力。我非常有信心这是正确的,但无法确认,因为我发现的练习的所有答案都是图片而我的屏幕阅读器无法读取它们。
(列表1(列表2(列表3 4))) - 我认为这是树本身或根节点。这棵树有两个分支或孩子 第一个分支(1)是一个叶子节点,所以我们在树的这一侧完成 第二个分支(列表2(列表3 4)是另一个树 现在我们关注子树(列表2(列表3 4)。它有两个子/分支 第一个分支是叶子节点(2),所以我们在这里完成 第二个分支是另一个树(列表3 4) 现在我们关注子树(列表3 4)。它有两个子分支 它们都是叶子节点,所以我们已经完成了。
这是对的吗?我是否正确地解释了这棵树?
答案 0 :(得分:2)
您的解释是正确的。解释器打印的结果是(1 (2 (3 4)))
,即您描述的树。
答案 1 :(得分:2)
Lisp中真正的列表构建原语是cons
。作为评估表单(list 1 2 3)
的结果的列表与评估(cons 1 (cons 2 (cons 3 '())))
的结果相同,也可以写成'(1 2 3 . ())
,或者以完全虚线的形式{{1 }}。
所有这些都将由翻译人员打印为'(1 . (2 . (3 . ())))
:
(1 2 3)
作为树查看,(list 1 2 3) '(1 2 3) ; (1 2 3)
(cons 1 (list 2 3)) '(1 . (2 3)) ; (1 2 3)
(cons 1 (cons 2 (list 3))) '(1 . (2 . (3))) ; (1 2 3)
(cons 1 (cons 2 (cons 3 '()))) '(1 . (2 . (3 . ()))) ; (1 2 3)
有三个分支 - 都是叶节点:1,2和3.另一方面,(1 2 3)
有两个分支 - 一个叶子和一个树两个叶节点。 (1 (2 3))
也有两个分支 - 一个有两个叶子分支的树和一个叶子分支。
作为盒子和指针的结构,点表示cons单元(即盒子),每个单元有两个槽或指针 - ((1 2) 3)
(点的左边)和{{1 (点的右边)。
因此,评估car
的结果(打印为cdr
)也是通过调用(list 1 (list 2 3))
构建的;所以作为一个盒子和指针结构它真的是(1 (2 3))
。其(cons 1 (cons (cons 2 (cons 3 '())) '()))
为'(1 . ( (2 . (3 . ())) . () ))
,其car
为1
为cdr
及其( (2 . (3 . ())) . () )
的框cdr
- 框()
;等
最后一个框car
中(2 . (3 . ()))
的列表被称为"正确的列表"。任何其他人被称为"不正确的列表",例如
()