Scheme中的内存表示

时间:2015-12-01 23:02:55

标签: recursion scheme

给定一对我想要制作一个包含对元素的列表,以及它们在列表中的位置(逆序)。例子:

(cons "a" "b") turns into ((0 . 1) "b" "a")
(cons (cons "a" "b") (cons "x" "y")) turns into
((2 . 5) (3 . 4) "y" "x" (0 . 1) "b" "a")
(cons (cons (cons "x" "y") (cons "a" "b")) (cons (cons "x1" "y1") (cons "a1" "b1"))) 
turns into
((6 . 13) (9 . 12) (10 . 11) "b1" "a1" (7 . 8) "y1" "x1" (2 . 5) (3 . 4) "b" "a" (0 . 1) "y" "x")

我不知道如何创建数字对 - 不知道他们遵循的是什么顺序。

1 个答案:

答案 0 :(得分:2)

首先,我绝对认为这是家庭作业;否则写这个函数会有点疯狂。看起来你被要求"压扁"将树结构转换为向量,其中每个单元格包含一个字符串或一对。 "从列表的末尾开始计算"是一种允许您使用增加的内存位置建模矢量的方法;当您将内容添加到列表的前面时,从现有元素到结尾的距离不会发生变化。

说完了,让我们开始吧。这个问题非常复杂,因为它使用了累加器。实际上,它使用两个累加器。 HtDP 2e教科书在第6节中介绍了这一点:

http://www.ccs.neu.edu/home/matthias/HtDP2e/part_six.html

在此之前有一个很多的阅读,这是有原因的;能够确定哪种累加器对给定问题有意义需要很多经验。在这种情况下,你需要弄清楚"中间"信息是你需要在计算这个东西的过程中跟踪。因此,例如,假设您已经给出了树#((" a"。" b")。" c)。手工构建答案,一步一步。跟踪单独的步骤。看看你是否可以描述"中间"您需要跟踪的信息。

叹息......这是教师在不考虑所需推理类型的情况下分配的问题。