Rubyは再帰配列(つまり、自己完結型配列)をサポートしています。
a = []
# => []
a << a
# => [[...]]
a.first == a
# => true
これは本質的にクールですが、それを使ってどのような作業ができますか?
微分されていないエッジを持つ有向グラフでは、各頂点を、その頂点から到達可能な頂点の配列として単純に表すことができます。グラフにサイクルがある場合、特にエッジが同じ頂点に戻る可能性がある場合は、「再帰配列」があります。
たとえば、次のグラフ:
...コードでは次のように表すことができます。
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=>[]}
通常、各頂点の表現はより「堅牢」になります (たとえば、出力エッジの名前と配列のプロパティを持つクラス インスタンス)。大きなグラフ)、このような最小限の表現を使用する必要がありました。
Ruby は再帰配列をサポートしています
私にとっての質問は、なぜそれをサポートしてはいけないのですか?
配列は単なる参照のコレクションです。各要素をチェックし、いずれかがコレクション自体を参照している場合はエラーをスローする必要があるため、再帰を防止するか、Phrogz の例のようなグラフに使用します。
だから私はそれが機能だとは思いませんが、もしそうなら、私が知っているほとんどの言語、Java でさえそれを持っています..オブジェクトを配列要素として使用するだけです。