30

Ruby 支持递归数组(即自包含数组):

a = []
# => [] 
a << a
# => [[...]] 
a.first == a
# => true 

这本质上很酷,但是你能用它做什么工作呢?

4

2 回答 2

43

具有未区分边的有向图可以将每个顶点简单地表示为从该顶点可到达的顶点的数组。如果图形有循环,您将拥有一个“递归数组”,特别是如果一条边可以返回同一个顶点。

例如,此图:
有向循环图
...可以在代码中表示为:

nodes = { a:[], b:[], c:[], d:[] }
nodes[:a] << nodes[:a]
nodes[:a] << nodes[:b]
nodes[:b] << nodes[:a]
nodes[:b] << nodes[:c]
p nodes
#=> {:a=>[[[...], []], [...]], :b=>[[[...], [...]], []], :c=>[], :d=>[]}

通常每个顶点的表示会更“健壮”(例如,具有名称和传出边数组属性的类实例),但并非不可能想象您想要一个非常轻量级的数据表示的情况(对于非常大图),因此需要使用像这样的最小表示。

于 2012-05-15T20:53:32.977 回答
8

Ruby 支持递归数组

对我来说,问题是它为什么支持它?

数组只是引用的集合。它是否应该检查每个元素并在其中一个引用集合本身时抛出错误,所以防止递归或将其用于像 Phrogz 示例这样的图形。

所以我不认为这是一个特性,但如果是这样的话,我知道的大多数语言都有它,甚至 Java ..只需使用 Object 作为 Array 元素。

于 2012-05-15T21:56:17.880 回答