क्या stream
को स्कैला में backtracking
एल्गोरिदम के साथ परिभाषित करने का कोई तरीका है?बैकट्रैकिंग एल्गोरिदम को स्ट्रीम करने के लिए कैसे परिवर्तित करें?
उदाहरण के लिए, निम्नलिखित backtracking
एल्गोरिदम किसी दिए गए आकार के सभी "बाइनरी" तारों को प्रिंट करता है।
def binaries(s:String, n:Int) { if (s.size == n) println(s) else { binaries(s + '0', n) binaries(s + '1', n) } }
मेरा मानना है कि मैं किसी दिए गए आकार एक और पुनरावृत्ति एल्गोरिथ्म का उपयोग कर के "बाइनरी" तार के एक stream
परिभाषित कर सकते हैं। हालांकि मुझे आश्चर्य है कि क्या मैं एल्गोरिदम को stream
पर बैकट्रैकिंग कर सकता हूं।
धन्यवाद, यह वही है जो मैं ढूंढ रहा हूं :) यह मूल बैकट्रैकिंग संस्करण की तुलना में अधिक कुशल (स्टैक मेमोरी खपत के मामले में) जैसा दिखता है, है ना? – Michael
@ माइकल शायद। मैं 'स्ट्रीम' का उपयोग कर कोड की सहज विश्लेषण दक्षता नहीं हूं। अगर मुझे उनका उपयोग करना आवश्यक लगता है, तो मैं यह सुनिश्चित करने के लिए आरईपीएल पर कोड का परीक्षण करना सुनिश्चित करता हूं कि यह अतिप्रवाह नहीं है। –
@ माइकल, स्टैक फ्रेम उपयोग के संदर्भ में स्ट्रीम संस्करण कम कुशल है। प्रत्येक रिकर्सिव कॉल आपके संस्करण में केवल एक की तुलना में 4 स्टैक फ्रेम का उपयोग करता है। अभ्यास में, यह इस उदाहरण के लिए एक समस्या नहीं होनी चाहिए। ढेर मेमोरी उपयोग के संबंध में, स्ट्रीम क्लास संग्रहित प्रति संदर्भ स्मृति उपयोग की अवधि में स्कैला संग्रह के कम से कम कुशल में से एक है, लेकिन आमतौर पर यह ठीक है अगर आप गलती से स्ट्रीम के सिर पर नहीं जाते हैं ... – huynhjl