मुझे कुछ साल पहले इस सटीक समस्या को हल करना पड़ा। मैं अपने खुद के समाधान के साथ आने के लिए सक्षम नहीं था, लेकिन इसके बजाय कोड की इस अद्भुत टुकड़ा है जो प्रत्यावर्तन के साथ map
के चतुर और विवेकपूर्ण उपयोग शामिल है भर में भाग गया:
#!/usr/bin/perl
print "permute:\n";
print "[", join(", ", @$_), "]\n" for permute([1,2,3], [4,5,6], [7,8,9]);
sub permute {
my $last = pop @_;
unless(@_) {
return map([$_], @$last);
}
return map {
my $left = $_;
map([@$left, $_], @$last)
}
permute(@_);
}
हाँ, यह पागल है, लेकिन मुझे अनुमति देते हैं समझाना! समारोह @_
खाली होने तक रिकर्स करेगा, जिस बिंदु पर यह ([1], [2], [3])
(तीन सरणी की एक सूची) को रिकर्सन के पिछले स्तर पर लौटाता है। उस स्तर पर $last
एक सरणी का संदर्भ है जिसमें [4, 5, 6]
है।
बाहरी नक्शे के शरीर तो [1]
, तो [2]
और अंत में [3]
करने के लिए $_
सेट के साथ तीन बार चलाया जाता है। आंतरिक मानचित्र को बाहरी मानचित्र के प्रत्येक पुनरावृत्ति के लिए (4, 5, 6)
पर चलाया जाता है और यह ([1, 4], [1, 5], [1, 6])
, ([2, 4], [2, 5], [2, 6])
, और अंत में ([3, 4], [3, 5], [3, 6])
देता है।
अंतिम लेकिन एक रिकर्सिव कॉल तब ([1, 4], [1, 5], [1, 6], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6])
देता है।
फिर, यह [7,8,9]
के खिलाफ है कि परिणाम है, जो आप [1, 4, 7], [1, 4, 8], [1, 4, 9], [1, 5, 7], [1, 5, 8], [1, 5, 9], [1, 6, 7], [1, 6, 8], [1, 6, 9], [2, 4, 7], [2, 4, 8], [2, 4, 9], [2, 5, 7], [2, 5, 8], [2, 5, 9], [2, 6, 7], [2, 6, 8], [2, 6, 9], [3, 4, 7], [3, 4, 8], [3, 4, 9], [3, 5, 7], [3, 5, 8], [3, 5, 9], [3, 6, 7], [3, 6, 8], [3, 6, 9]
मैं किसी ने मुझे यह समझाने के लिए पूछ perlmonks.org पर कोई प्रश्न पोस्ट याद देता है चलाता है।
आप आसानी से इस समस्या को अपनी समस्या में अनुकूलित कर सकते हैं।
यह परिवर्तन नहीं है - क्रमचय एक सेट की orderings है (उदाहरण के लिए {ए, बी, सी} -> (ए, बी, सी), (ए, सी, बी), (बी, ए, सी), ...)। – Cascabel
ओह क्षमा करें। मुझे नहीं पता था। क्या यह संयोजन है ?? – user295033
वास्तव में, मैं सिर्फ देखा यह डुप्लिकेट है: देखो http://stackoverflow.com/questions/1256036/in-perl-how-can-i-iterate-over-the-cartesian-product-of-multiple-sets –