हाल ही में मैंने गैर-तुच्छ बाधाओं के साथ कुछ अनुक्रम उत्पन्न करने के लिए एक फ़ंक्शन लिखा था। समस्या एक प्राकृतिक पुनरावर्ती समाधान के साथ आई थी। अब ऐसा होता है कि, अपेक्षाकृत छोटे इनपुट के लिए भी, अनुक्रम कई हज़ार हैं, इस प्रकार मैं सभी अनुक्रमों के साथ एक सूची को भरने के लिए इसका उपयोग करने के बजाय एक जनरेटर के रूप में अपने एल्गोरिदम का उपयोग करना पसंद करूंगा।
यहाँ है एक उदाहरण। मान लीजिए कि हम एक पुनरावर्ती फ़ंक्शन के साथ एक स्ट्रिंग के सभी क्रमपरिवर्तन की गणना करना चाहते हैं। निम्नलिखित भोले एल्गोरिथ्म एक अतिरिक्त तर्क "भंडारण" लेता है और जब भी उसे एक मिलता है तो उसमें क्रमपरिवर्तन जोड़ता है:
def getPermutations(string, storage, prefix=""): if len(string) == 1: स्टोरेज.एपेंड (उपसर्ग + स्ट्रिंग) # <----- अन्य: के लिए मैं रेंज में (लेन (स्ट्रिंग)): getPermutations (स्ट्रिंग [: i] + स्ट्रिंग [i + 1:], भंडारण , उपसर्ग + स्ट्रिंग [i]) भंडारण = [] getPermutations ("abcd", भंडारण) भंडारण में क्रमपरिवर्तन के लिए: प्रिंट क्रमपरिवर्तन
(कृपया अक्षमता की परवाह न करें, यह केवल है एक उदाहरण।)
अब मैं अपने फ़ंक्शन को जेनरेटर में बदलना चाहता हूं, यानी इसे स्टोरेज सूची में जोड़ने के बजाय क्रमपरिवर्तन उत्पन्न करना चाहता हूं:
def getPermutations(string , उपसर्ग = ""): यदि लेन (स्ट्रिंग) == 1: उपज उपसर्ग + स्ट्रिंग # <----- अन्य: मैं सीमा में (लेन (स्ट्रिंग)): getPermutations (स्ट्रिंग [: i] + स्ट्रिंग [i+1:], प्रीफ़िक्स+स्ट्रिंग[i]) getPermutations("abcd") में क्रमपरिवर्तन के लिए: प्रिंट क्रमचय
यह कोड नहीं काम करता है ( समारोह एक em . की तरह व्यवहार करता है पीटीआई जनरेटर)।
क्या मुझे कुछ याद आ रहा है? क्या उपरोक्त पुनरावर्ती एल्गोरिथम को एक जनरेटर में बदलने का कोई तरीका है इसे एक पुनरावृत्त के साथ बदले बिना?