Для чего нужны рекурсивные массивы?

Ruby поддерживает рекурсивные массивы (то есть самосохраняемые массивы):

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

Это по-настоящему круто, но с чем вы можете работать?

Ответ 1

A ориентированный граф с недифференцированными ребрами может иметь каждую вершину, представленную просто как массив вершин, доступных из этой вершины. Если график имел циклы, у вас был бы "рекурсивный массив", особенно если ребро могло вернуться к той же вершине.

Например, этот график:
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=>[]}

Обычно представление каждой вершины было бы более "надежным" (например, экземпляр класса со свойствами для имени и массива исходящих ребер), но не представляется возможным представить себе случай, когда вам нужно очень легкое представление ваших данных (для очень больших графиков) и поэтому необходимо использовать минимальное представление, подобное этому.

Ответ 2

Ruby поддерживает рекурсивные массивы

Для меня вопрос, почему он не должен его поддерживать?

Массив - это просто набор ссылок. Если он проверяет каждый элемент и выдает ошибку, если один из имен относится к самой коллекции, то предотвратите рекурсию или используйте ее для графиков, например, пример Phrogz.

Поэтому я не думаю, что это функция, но если бы это было так, большинство языков, которые я знаю, есть, даже Java.. Просто используйте объекты как элементы массива.