यह वास्तव में स्पष्ट नहीं है कि आप क्या पूछ रहे हैं। यह कुछ अलग चीजों में से एक हो सकता है। सबसे पहले सूची में विभिन्न तत्वों के सरल संयोजन होंगे। स्कैला संग्रह से combinations()
विधि के साथ प्रदान करता है। यदि तत्व अलग हैं, तो व्यवहार वास्तव में "संयोजन" की शास्त्रीय परिभाषा से अपेक्षा करता है। पी तत्वों के एन-तत्व संयोजनों के लिए पी होगा!/एन! (पी-एन)! आउटपुट में संयोजन।
यदि सूची में दोहराए गए तत्व हैं, हालांकि, स्कैला संयोजन में एक से अधिक बार प्रदर्शित होने वाले आइटम के साथ संयोजन उत्पन्न करेगी। लेकिन केवल अलग-अलग संभावित संयोजन, तत्व के साथ संभवतः इनपुट में मौजूद कई बार दोहराया जाता है। यह केवल संभावित संयोजनों का सेट उत्पन्न करता है, इसलिए तत्वों को दोहराया जाता है, लेकिन संयोजनों को दोहराया नहीं जाता है। मुझे यकीन नहीं है कि अगर अंतर्निहित है तो वास्तविक Set
पर एक इटरेटर है।
अब यदि आप सही ढंग से समझते हैं तो वास्तव में क्या मतलब है विभिन्न पी तत्वों के दिए गए सेट से संयोजन, जहां एक संयोजन संयोजन में बार-बार एन बार प्रदर्शित हो सकता है।
ठीक है, इनपुट में बार-बार तत्व होने पर संयोजन उत्पन्न करने के लिए थोड़ा सा वापस आना, और आप आउटपुट में बार-बार संयोजन देखना चाहते हैं, इसके बारे में जाने का तरीका सिर्फ "क्रूर बल" "एन नेस्टेड loops का उपयोग कर। ध्यान दें कि इसके बारे में वास्तव में कुछ भी क्रूर नहीं है, यह केवल संयोजनों की प्राकृतिक संख्या है, वास्तव में, जो छोटे एन के लिए ओ (पी^एन) है, और इसके बारे में आप कुछ भी नहीं कर सकते हैं। आप केवल इस तरह, ठीक से इन मूल्यों को लेने के लिए सावधान रहना चाहिए:
val a = List(1,1,2,3,4)
def comb = for (i <- 0 until a.size - 1; j <- i+1 until a.size) yield (a(i), a(j))
में
scala> comb
res55: scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector((1,1), (1,2), (1,3), (1,4), (1,2), (1,3), (1,4), (2,3), (2,4), (3,4))
यह एक में इन दोहराया मूल्यों से संयोजन उत्पन्न करता है पहले के रूप में 0 until a.size
के मध्यवर्ती संयोजन बनाने के द्वारा जिसके परिणामस्वरूप (i, j) ...
अब "repetitions के साथ संयोजन" बनाने के लिए आप सिर्फ इस तरह के सूचकांक बदलना होगा:
val a = List('A','B','C')
def comb = for (i <- 0 until a.size; j <- i until a.size) yield (a(i), a(j))
का उत्पादन करेगा
List((A,A), (A,B), (A,C), (B,B), (B,C), (C,C))
लेकिन मुझे यकीन है सबसे अच्छा तरीका बड़ा संयोजन को यह सामान्यीकरण करने के लिए क्या नहीं कर रहा हूँ।
अब जब मैं इस पोस्ट को मिला, तो मैं उस चीज़ के साथ बंद हूं जो एक इनपुट से संयोजन उत्पन्न करता है जिसमें दोहराए गए तत्व होते हैं, combinations()
द्वारा उत्पन्न मध्यस्थ सूचकांक के साथ। यह अच्छा है कि यह विधि एक टुपल की बजाय एक सूची तैयार करती है, इसका मतलब है कि हम वास्तव में "मानचित्र के मानचित्र" का उपयोग करके समस्या का समाधान कर सकते हैं, कुछ मुझे यकीन नहीं है कि किसी और ने यहां प्रस्तावित किया है, लेकिन यह बहुत निफ्टी है और आप इसे देखने के बाद एफपी और स्कैला के लिए अपना प्यार थोड़ा और बढ़ा देंगे!
def comb[N](p:Seq[N], n:Int) = (0 until p.size).combinations(n) map { _ map p }
परिणाम
scala> val a = List('A','A','B','C')
scala> comb(a, 2).toList
res60: List[scala.collection.immutable.IndexedSeq[Int]] = List(Vector(1, 1), Vector(1, 2), Vector(1, 3), Vector(1, 2), Vector(1, 3), Vector(2, 3))
में आप कर सकते हैं और साथ ही सवाल पर पेस्ट करें, स्रोत कोड के रूप में यह अंकन। –
कृपया इसे "उत्तर" के रूप में दोबारा पोस्ट करने के बजाय प्रश्न संपादित करें। –