Scheme 方案-使用列表列表

Scheme 方案-使用列表列表,scheme,racket,Scheme,Racket,目前,对于一项作业,我正在研究一个方案问题,我们使用方案列表表示一个图。我们使用的第一个变体是一个表示为 '((x y) (y z) (x z)) ((x (y z)) (y (z)) (z ())) 我们正在使用的图的第二个变体称为x图,表示为 '((x y) (y z) (x z)) ((x (y z)) (y (z)) (z ())) 我们的任务是编写两个过程来从一种形式转换到另一种形式,我不知道如何解决这个问题。我理解这个公式的基本思想,抓取一个节点,然后构建一个列表,或者基于边

目前,对于一项作业,我正在研究一个方案问题,我们使用方案列表表示一个图。我们使用的第一个变体是一个表示为

'((x y) (y z) (x z))
((x (y z)) (y (z)) (z ()))
我们正在使用的图的第二个变体称为x图,表示为

'((x y) (y z) (x z))
((x (y z)) (y (z)) (z ()))
我们的任务是编写两个过程来从一种形式转换到另一种形式,我不知道如何解决这个问题。我理解这个公式的基本思想,抓取一个节点,然后构建一个列表,或者基于边进行解构,但我不知道如何在继续的过程中构建列表。寻找一些指导,而不是答案

如果我描述得不够好,我会把这个问题贴在这里只是为了进一步澄清

考虑两种将图形表示为方案列表的技术。我们可以将有向图表示为边列表。我们称这种表示为el图(即边列表图)。边本身是长度为2的列表,第一个元素是表示边源的符号,第二个元素是表示边目标的符号。请注意,边是一个列表(而不仅仅是一对)。例如,下面是一个图形:'((xy)(yz)(yz))。我们也可以表示类似于邻接矩阵的图。我们称这种表示为x图(即矩阵图)。在这种情况下,图是邻接列表,其中邻接是长度为2的列表,因此第一个元素是节点(符号),第二个元素是该节点的目标列表。例如,下面是一个图形:'((x(y z))(y(z))(z())


下面的代码片段是实际的答案,但我尽了最大努力实际解释了所做的工作,这样您就可以忽略代码并编写自己的东西,如果您愿意的话

从x图到边列表图的转换非常简单。考虑你的例子:<代码>((x(y z))(y(z))(z()))< /代码>。进入第一个子列表时,您希望生成
((xy)(xz))
;进入第二个子列表时,您希望生成
((y z))
;当您进入第三个子列表时,您希望生成
()
。然后使用
append map
将所有这些结果平面映射到单个列表中

(define (x-graph->el-graph g)
  (append-map (lambda (sublist)
                (define from-node (car sublist))
                (define to-nodes (cadr sublist))
                (map (lambda (to-node)
                       (list from-node to-node))
                     to-nodes))
              g))

使用
groupby
按from节点对边进行分组,然后收集每组中的to节点,从边列表图到x图可能最容易完成。但是,这不会给您提供空的
z
关联(我将留给您作为练习)


你能不能再多解释一点分组是如何工作的,我们还没有了解它,所以只是好奇它是如何工作的。
groupby
的定义如下:基本上,它是:1。构建一个散列,由键控函数的结果设置键控,值是具有相同键的值的列表;2.返回该散列的值,按原始列表中第一次出现的位置排序。