【问题标题】:understanding the tree in SICP - exercise 2.24理解 SICP 中的树 - 练习 2.24
【发布时间】:2016-01-05 07:00:05
【问题描述】:

来自SICP

练习 2.24:假设我们计算表达式 (list 1 (list 2 (list 3 4)))。给出解释器打印的结果,相应的框和指针结构,并将其解释为一棵树(如图 2.6 所示)。

问题是我的眼睛被毁了,所以我既看不到盒子和指针图,也看不到图2.6。所以现在我只能猜测这个列表应该是什么样的树,基于:

另一种考虑元素是序列的序列的方法是树。序列的元素是树的分支,而本身是序列的元素是子树。

请检查我的树解释。这只是我的想象。我很确定这是正确的,但无法确认,因为我找到的所有练习答案都是图片,我的屏幕阅读器无法阅读。

(list 1 (list 2 (list 3 4))) - 我认为这是树本身,或根节点。这棵树有两个分支或孩子。
第一个分支 (1) 是叶节点,所以我们在树的这一侧完成。
第二个分支(list 2 (list 3 4) 是另一棵树。
现在我们关注子树 (list 2 (list 3 4)。它有两个子/分支。
第一个分支是叶节点 (2),所以我们到这里就完成了。
第二个分支是另一棵树(列表 3 4)。
现在我们关注子树(列表 3 4)。它有两个子分支。
它们都是叶子节点,所以我们完成了。

这是正确的吗?我对树的解释是否正确?

【问题讨论】:

    标签: list tree scheme lisp sicp


    【解决方案1】:

    Lisp 中真正的列表构建原语是cons。对(list 1 2 3) 形式求值的列表与(cons 1 (cons 2 (cons 3 '()))) 求值结果相同,也可以写成'(1 2 3 . ()),或者完全用虚线形式写成'(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)) 有两个分支 - 一个叶和一个由两个叶节点组成的树.而((1 2) 3)也有两个分支——一棵有两个叶子分支的树,一个叶子分支。

    作为 box-and-pointers 结构,点表示 cons 单元(即盒子),每个单元都有两个插槽或指针 - car(点左侧)和 cdr(指向点的右边)。

    因此,计算(list 1 (list 2 3)) 的结果,打印为(1 (2 3)),也是由调用(cons 1 (cons (cons 2 (cons 3 '())) '())) 构造的;所以作为一个盒子和指针结构,它实际上是'(1 . ( (2 . (3 . ())) . () ))。它的car1,它的cdr 是盒子( (2 . (3 . ())) . () ),其cdr(),它的car - 盒子(2 . (3 . ()));等等

    在最后一个框的cdr 中带有() 的列表称为“正确列表”。任何其他人都被称为“不当列表”,例如

    '(1 2 . 3) 
    = '(1 . (2 . 3))
    = (cons 1 (cons 2 3))
    

    【讨论】:

      【解决方案2】:

      你的解释是正确的。解释器打印的结果是(1 (2 (3 4))),也就是你描述的那棵树。

      【讨论】:

        猜你喜欢
        • 2012-07-05
        • 2011-11-05
        • 2017-02-03
        • 2010-12-26
        • 2012-12-15
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        相关资源
        最近更新 更多