में एक गुना shortcircuit मुझे लगता है कि जैसे एक पुनरावर्ती समारोह के साथ स्काला में एक साधारण गहराई-पहले खोज में लिखा है:तोड़ या स्काला
search(labyrinth, path, goal)
जहां भूलभुलैया समस्या का एक विनिर्देश है (ग्राफ या जो कुछ भी रूप में), पथ एक ऐसी सूची है जो अब तक उठाए गए पथ को रखती है और लक्ष्य लक्ष्य राज्य का एक विनिर्देश है। यदि कोई पथ नहीं मिल पाता है तो फ़ंक्शन लक्ष्य और नील के रूप में लक्ष्य के लिए पथ प्रदान करता है।
फ़ंक्शन फैलता है, उदा। सभी उपयुक्त अगले नोड्स (उम्मीदवार) पाता है और फिर उसे खुद को कॉल करना पड़ता है।
मैं द्वारा
candidates.foldLeft(Nil){
(solution, next) =>
if(solution == Nil)
search(labyrinth, next :: path, goal)
else
solution
}
ऐसा करने कृपया ध्यान दें कि मैं कुछ unescessary विवरण नहीं दिखाए हैं। सब कुछ ठीक काम कर रहा है। लेकिन फ़ोल्ड लेफ्ट कॉल के अंदर एक समाधान मिलने के बाद, यह समाधान बस-कथन के दूसरे भाग द्वारा कॉपी किया जाता है। क्या FoldLeft को तोड़कर या शायद foldLeft के बजाय एक अलग फ़ंक्शन का उपयोग करके इसे टालने का कोई तरीका है? असल में मैं शायद फोल्ड लेफ्ट का एक संस्करण लिख सकता हूं जो एक बार "नील" नहीं लौटाता है। लेकिन क्या एपीआई के अंदर कोई है?
आप वास्तव में से बचने की क्या कोशिश कर रहे हैं? कहीं भी कोई प्रतिलिपि नहीं जा रही है। – Apocalisp
क्या वह सूची में प्रत्येक शेष आइटम के लिए कम से कम एक फ़ंक्शन कॉल नहीं करेगा? –
foldLeft के साथ, हाँ। लेकिन, फिर, फोल्ड लेफ्ट कुछ ऐसा करने के लिए झुक रहा है जिसका इरादा नहीं था। –