2012-05-15 11 views
30

Ruby obsługuje rekurencyjne tablic (czyli tablice zawierające własny):Do czego służą tablice rekurencyjne?

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

Jest wewnętrznie fajne, ale jakie prace można z nim zrobić?

+3

Należy zauważyć, że ten przykład jest łatwy, ponieważ 'a.pierwsza' i' a' są dokładnie tym samym obiektem (ten sam "id_obiektu"). Ruby obsługuje także porównanie niezależnych struktur rekursywnych (np. 'B = []; b << b; a == b # => true'). –

Odpowiedz

43

A directed graph z niezróżnicowanymi krawędziami może mieć każdy wierzchołek reprezentowany po prostu jako tablica wierzchołków osiągalnych z tego wierzchołka. Jeśli wykres miałby cykle, miałbyś "tablicę rekurencyjną", szczególnie jeśli krawędź mogłaby doprowadzić z powrotem do tego samego wierzchołka.

Dla przykładu, wykres:
directed cyclic graph
... może być przedstawiony w postaci kodu jako:

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

Zazwyczaj reprezentacja każdego wierzchołka byłoby bardziej „wytrzymała” (na przykład przypadek z klasy właściwości nazwy i tablicy wychodzących krawędzi), ale nie można wyobrazić sobie przypadku, w którym potrzebna byłaby bardzo mała reprezentacja danych (w przypadku bardzo dużych wykresów), a zatem potrzebna była minimalna reprezentacja w tym stylu.

+0

Ale jakie to ma zastosowanie? – Simpleton

+2

@Splpleton Jakie aplikacje mają [skierowane wykresy] (http://en.wikipedia.org/wiki/Directed_graph)? Dużo! Wyszukiwanie trasy; [ustalanie hierarchii zależności opartych na komórkach formuł] (http://phrogz.net/traversingdirectedgraph) w celu nazwania dwóch. – Phrogz

+0

Nie możesz zrobić dokładnie tego samego w prawie każdym języku, który obsługuje elementy odniesienia na listach? – inger

8

Ruby obsługuje rekurencyjne tablice

Dla mnie pytanie jest dlaczego to nie to wsparcie?

Tablica to po prostu zbiór referencji. Powinieneś sprawdzić każdy element i podać błąd, jeśli jeden z nich odnosi się do samego zbioru, więc nie używaj rekursji lub użyj go do wykresów takich jak przykład Phrogza.

Więc nie sądzę, że jest to funkcja, ale gdyby tak było, większość znanych języków ją posiada, nawet Java. Wystarczy użyć obiektów jako elementów tablicy.

+4

Nie jestem świadomy innego języka poza Ruby, który silnie obsługuje tablice rekursywne. Na przykład, nie sądzę, że możesz porównać dwie różne tablice rekurencyjne w dowolnym innym języku. W języku Ruby: 'a = []; a << a; b = []; b << b; a == b # => true' –

+2

@ Marc-André right to ciekawa narożna sprawa, nie jestem pewien, kto ma wiele innych języków na poziomie wsparcia. Patrząc na pytanie/przykład byłem (błędnie?) Interpretując pojęcie PO "wsparcia", ponieważ pozwala on na tworzenie powtarzających się tablic - które w większości języków AFAIK. – inger

Powiązane problemy