什么是递归数组有用?

hof*_*ffm 30 ruby arrays recursion

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

a = []
# => [] 
a << a
# => [[...]] 
a.first == a
# => true 
Run Code Online (Sandbox Code Playgroud)

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

Phr*_*ogz 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=>[]}
Run Code Online (Sandbox Code Playgroud)

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

  • @Simpleton [有向图](http://en.wikipedia.org/wiki/Directed_graph)有哪些应用程序?地段!路线寻找; [建立基于单元格的公式依赖关系的层次结构](http://phrogz.net/traversingdirectedgraph)来命名两个. (2认同)

ing*_*ger 8

Ruby支持递归数组

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

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

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

  • 我不知道除Ruby之外的另一种语言强烈支持递归数组.例如,我认为你不能用任何其他语言比较两个不同的递归数组.在Ruby中:`a = []; a << a; b = []; b << b; a == b#=> true` (4认同)
  • @ Marc-André对,这是一个有趣的角落案例,不确定是否有许多其他语言都有这种支持水平.看看问题/例子我是(错误?)解释OP的'支持'概念,因为它允许你_creating_递归数组 - 大多数语言都是AFAIK. (2认同)