Bri*_*ate 2 lisp scheme linked-list list nested-lists
我目前正在学习伯克利 2011 年夏季 CS3L 课程,并且正在努力理解方框图和指针图。如何构建它们以及如何解释它们。
提供的说明在这里。但是,我仍然没有“得到它”。
我知道列表是对的组合,一对的 cdr 可能指向另一对。我也明白 cdr 指向的那对可能是另一个列表。我只是不明白如何将其全部绘制在图表中。
作为参考,这是我遇到的一个问题的示例:
(define cal
(list (append (list (cons (list 1 2) (cons 3 '())))
(list (cons 4 (cons 5 '()))))
6
7))
Run Code Online (Sandbox Code Playgroud)
给定一个类似上面的代码,我假设绘制盒子和指针图,然后能够说出 car 和 cdr 的组合是获得列表中任何给定数字所必需的。
再次,作为参考,下面是我应该能够想出的图表:
重申一下,我正在寻找的是可以更清楚地解释盒形图和指针图的构建的视频或文章。
预先感谢任何愿意为我指出正确方向的人。
小智 5
[请注意,此答案不鼓励您作弊:如果您正在学习的课程要求您能够绘制方框和指针图,那么您应该能够做到这一点,而不是让程序为您做这件事。但该程序可以帮助您学习。]
学习方框和指针图如何工作的一种好方法是能够与知道如何绘制它们的程序交谈。在 Lisp 很久以前的黄金时代,我们的 Lisp 机器上有很棒的对话界面,可以让图形和文本混合在一起,还有漂亮的绘图程序,可以很容易地构建工具来做到这一点。使用这些工具,您可以根据 conses 构建各种结构,并让程序为您绘制图表,从而很好地掌握这些结构的工作原理。
嗯……事实证明,Lisp 的黄金时代已经到来。如果您使用Racket(如果您还没有使用 Racket,则可以使用它),那么有一个非常棒的包sdraw可以做到这一点。它没有与 Racket 发行版捆绑在一起,但是要安装它,您可以使用 DrRacket 的包管理器或直接执行
raco pkg install --auto sdraw
Run Code Online (Sandbox Code Playgroud)
这将安装它。现在您可以(在 DrRacket 窗口中,这在终端会话中不起作用)只需与 Racket REPL 交谈并让它为您绘制缺点树:
通过简单地与语言交互并让它为您绘制东西,您就可以很好地了解各种结构如何结合在一起。