什么是递归数组有用?

时间:2012-05-15 18:31:44

标签: ruby arrays recursion

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

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

这本质上很酷,但你可以用它做什么工作?

2 个答案:

答案 0 :(得分:43)

具有未分化边的directed graph可以将每个顶点简单地表示为从该顶点可到达的顶点的数组。如果图形具有周期,则会有一个“递归数组”,特别是如果边可以返回到同一个顶点。

例如,此图表:
directed cyclic graph
...可以在代码中表示为:

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=>[]}

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

答案 1 :(得分:8)

  

Ruby支持递归数组

对我而言,问题是为什么支持它?

Array只是引用的集合。 如果其中一个元素引用了集合本身,它应该检查每个元素并抛出一个错误,所以要防止递归或将它用于像Phrogz这样的图形。

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