Answers:
自从我在LISP工作以来已经有一段时间了,但是我记得,基本的非原子结构只是列表。其他一切都基于此。因此,您可以有一个原子列表,其中每个原子都是一个节点,然后是将节点连接到其他节点的边的列表。我敢肯定,还有其他方法可以做到这一点。
也许是这样的:
(
(a (b c)),
(b (a c)),
(c (a b d)),
(d (c))
)
可以给出这样的图形:
a <-> b <-> c <-> d ^^ | | + --------- +
如果想花哨的话,也可以增加权重:
(
(a (b 1.0 c 2.0)),
(b (a 1.0 c 1.0)),
(c (a 1.3 b 7.2 d 10.5)),
(d (c -10.5))
)
您可能也对此感兴趣:CL-Graph(通过google搜索短语“ lisp图结构”找到)
功能性语言处理数据结构的方式与非功能性语言相同:将接口与实现分开,创建抽象数据类型。
您可以在Lisp中创建抽象数据类型。例如,对于图形,您可能需要几个函数:
(define (get-vertices graph) ;; gets all the vertices from a graph
...)
(define (get-edges graph) ;; gets all the edges from a graph
...)
(define (get-weight vertex-from vertex-to) ;; get the weight of a specific vertex
...)
一旦创建了该图的接口,就可以用许多不同的方式实现实际的数据结构,从而可能优化诸如程序员效率,灵活性和计算效率之类的因素。
关键是确保使用图形的代码仅使用图形接口,并且不会访问基础实现。这将使客户端代码更简单,因为它与实际的实现分离。