2012-05-15 15 views
30

Rubí soporte a matrices recursivas (es decir, matrices que contienen auto):¿Para qué sirven las matrices recursivas?

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

Esta es intrínsecamente bueno, pero lo que el trabajo se puede hacer con él?

+3

Tenga en cuenta que este ejemplo es fácil, ya que 'a.first' y' a' son exactamente el mismo objeto (el mismo 'object_id'). Ruby también admite la comparación de estructuras recursivas independientes (por ejemplo, 'b = []; b << b; a == b # => true'). –

Respuesta

43

A directed graph con bordes indiferenciados podría representarse cada vértice simplemente como una matriz de los vértices alcanzables desde ese vértice. Si el gráfico tuviera ciclos, tendrías una 'matriz recursiva', especialmente si un borde pudiera conducir al mismo vértice.

Por ejemplo, este gráfico:
directed cyclic graph
... podría estar representado en código como:

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

Por lo general, la representación de cada vértice habría más (por ejemplo, una instancia 'robusto' clase con propiedades para el nombre y la matriz de bordes salientes), pero no es imposible imaginar un caso en el que quisiera una representación muy ligera de sus datos (para gráficos muy grandes) y, por lo tanto, necesite utilizar una representación mínima como esta.

+0

Pero, ¿qué aplicación tiene esto posiblemente? – Simpleton

+2

@Simpleton ¿Qué aplicaciones tienen [gráficos dirigidos] (http://en.wikipedia.org/wiki/Directed_graph)? ¡Un montón! Búsqueda de ruta; [establecer una jerarquía de dependencias de fórmulas basadas en células] (http://phrogz.net/traversingdirectedgraph) para nombrar dos. – Phrogz

+0

¿No puede hacer exactamente lo mismo en casi cualquier idioma que admita elementos de referencia en las listas? – inger

8

Rubí soporte a matrices recursivas

Para mí la pregunta es ¿por qué debería no apoyo que?

Una matriz es simplemente una colección de referencias. Debería comprobar cada elemento y arrojar un error si uno de los hace referencia a la colección en sí, así que evite la recursión o la use para gráficos como el ejemplo de Phrogz.

Así que no creo que sea una característica, pero si lo fuera, la mayoría de los idiomas que conozco lo tienen, incluso Java. Simplemente use Object como elementos de matriz.

+4

No conozco otro idioma además de Ruby que sea compatible con matrices recursivas. Por ejemplo, no creo que pueda comparar dos matrices recursivas distintas en ningún otro idioma. En Ruby: 'a = []; a << a; b = []; b << b; a == b # => true' –

+2

@ Marc-André, a la derecha, es un caso de esquina interesante, no estoy seguro de cuántos otros idiomas tienen ese nivel de apoyo. Al ver la pregunta/ejemplo, ¿estaba (¿no?) Interpretando la noción de OP de "soporte", ya que le permite crear matrices recursivas, que la mayoría de las lenguas hace AFAIK. – inger

Cuestiones relacionadas