2012-05-15 18 views
30

रूबी पुनरावर्ती सरणियों (जो है, आत्म-युक्त सरणियों) का समर्थन करता है:रिकर्सिव सरणी के लिए क्या अच्छा है?

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

यह आंतरिक रूप से शांत है, लेकिन क्या काम आप इसके साथ कर सकते हैं?

+3

ध्यान दें कि यह उदाहरण आसान है, क्योंकि 'ए। फर्स्ट' और 'ए' बिल्कुल वही ऑब्जेक्ट (समान 'object_id') हैं। रूबी भी स्वतंत्र रिकर्सिव संरचनाओं की तुलना का समर्थन करता है (उदा। 'बी = []; बी << बी; ए == बी # => सच')। –

उत्तर

43

एक directed graph अविभाजित किनारों के साथ प्रत्येक चरम सीमा को उस चरम से पहुंचने वाले शीर्षकों की सरणी के रूप में प्रदर्शित किया जा सकता है। यदि ग्राफ़ के चक्र थे, तो आपके पास 'रिकर्सिव सरणी' होगी, खासकर अगर किनारे एक ही वर्टेक्स पर वापस जा सके।

उदाहरण के लिए, इस ग्राफ:
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=>[]} 

आमतौर पर प्रत्येक शिखर का प्रतिनिधित्व अधिक 'मजबूत' (जैसे एक वर्ग के साथ उदाहरण होगा आउटगोइंग किनारों के नाम और सरणी के गुण), लेकिन किसी ऐसे मामले की कल्पना करना असंभव नहीं है जहां आप अपने डेटा का बहुत हल्का प्रतिनिधित्व करना चाहते थे (बहुत बड़े ग्राफ के लिए) और इस तरह के न्यूनतम प्रतिनिधित्व का उपयोग करने के लिए आवश्यक है।

+0

लेकिन संभवतः इसका क्या अनुप्रयोग है? – Simpleton

+2

@ सिंपलटन कौन से अनुप्रयोग [निर्देशित ग्राफ] (http://en.wikipedia.org/wiki/Directed_graph) हैं? बहुत सारे! मार्ग खोजना; [सेल-आधारित फॉर्मूला निर्भरताओं का पदानुक्रम स्थापित करना] (http://phrogz.net/traversingdirectedgraph) दो नामों के लिए। – Phrogz

+0

क्या आप सूचियों में संदर्भ तत्वों का समर्थन करने वाली किसी भी भाषा में सटीक वही काम नहीं कर सकते हैं? – inger

8

रूबी पुनरावर्ती सरणियों

का समर्थन करता है
मेरे लिए

सवाल यह है कि क्यों यह नहीं समर्थन यह होना चाहिए?

एक ऐरे बस संदर्भों का संग्रह है। क्या यह प्रत्येक तत्व की जांच कर सकता है और अगर किसी एक संग्रह को संदर्भित करता है तो उसे एक त्रुटि फेंकना चाहिए, इसलिए पुनरावृत्ति को रोकें या इसे फ़ोगोज़ 'उदाहरण जैसे ग्राफ के लिए उपयोग करें।

इसलिए मुझे नहीं लगता कि यह एक विशेषता है, लेकिन अगर ऐसा होगा, तो मुझे पता है कि ज्यादातर भाषाओं में जावा भी है .. बस ऑरे तत्वों के रूप में ऑब्जेक्ट का उपयोग करें।

+4

मुझे रुबी के अलावा एक और भाषा के बारे में पता नहीं है जो दृढ़ता से पुनरावर्ती सरणी का समर्थन करता है। उदाहरण के लिए, मुझे नहीं लगता कि आप किसी भी अन्य भाषा में दो अलग-अलग रिकर्सिव सरणी की तुलना कर सकते हैं। रुबी में: 'ए = []; एक << ए; बी = []; बी << बी; एक == बी # => सच' –

+2

@ मार्क-आंद्रे सही है कि यह एक दिलचस्प कोने-केस है, यह सुनिश्चित न करें कि कौन सी अन्य भाषाओं में समर्थन का स्तर है। प्रश्न/उदाहरण को देखकर मैं (गलत?) 'समर्थन' की ओपी की धारणा को समझ रहा था क्योंकि यह आपको _creating_ पुनरावर्ती सरणी की अनुमति देता है - जो अधिकांश भाषा AFAIK करता है। – inger

संबंधित मुद्दे