मैं अपने इनपुट अनुक्रम के हिस्से का मूल्यांकन करने के बाद उच्च स्तरीय फ़ंक्शन को रोकने का एक तरीका ढूंढ रहा हूं।क्या उच्च-स्तरीय फ़ंक्शन का संक्षिप्त मूल्यांकन करना संभव है?
एक स्थिति पर विचार करें जब आप किसी अनुक्रम में पहली अनुक्रमणिका की तलाश करते हैं जो किसी निश्चित स्थिति को पूरा करता है।
func firstAbove100(a:[Int]) -> Int? {
if a.count < 2 {
return nil
}
for i in 0..<a.count-1 {
if a[i]+a[i+1] > 100 {
return i
}
}
return nil
}
: उदाहरण के लिए, मान लीजिए कि हम एक सरणी में प्रथम स्थान के लिए देख रहे
Int
की
a
रों जहां लगातार दो मानों का योग से ऊपर 100
तुम एक पाश के साथ यह कर सकते हैं, इस तरह है चलो
जैसे ही ब्याज की स्थिति की खोज की जाती है, लूपिंग बंद हो जाती है।
func firstAbove100(a:[Int]) -> Int? {
if a.count < 2 {
return nil
}
return (0..<a.count-1).reduce(nil) { prev, i in
prev ?? (a[i]+a[i+1] > 100 ? i : nil)
}
}
हालांकि, इस दृष्टिकोण का नुकसान यह है कि reduce
सब a.count-2
के लिए रास्ता भले ही वह बहुत पहले सूचकांक में एक मैच पाता चला जाता है:
हम इस कोड का उपयोग कर reduce
इस प्रकार पुनर्लेखन कर सकते हैं। नतीजा एक जैसा होगा, लेकिन अनावश्यक काम में कटौती करना अच्छा होगा।
क्या reduce
बनाने के लिए कोई तरीका है आगे के मैचों की कोशिश करना बंद करें, या शायद एक अलग फ़ंक्शन जो आपको पहले मैच को ढूंढने के बाद रोकने देता है?
@paulvs क्योंकि यह कॉपी-पेस्ट गलत हो गया है :-) धन्यवाद! – dasblinkenlight
मुझे नहीं लगता कि 'कम करने' के साथ ऐसा करने का कोई भी अंतर्निहित तरीका है। 'कम करने' का पूरा बिंदु यह है कि यह * पूरे * अनुक्रम को जोड़ता है और मूल्यांकन करता है। इस विशिष्ट उपयोग के मामले के लिए, आपको शायद अपना खुद का फ़ंक्शन लिखना होगा, जैसा कि आपने अपने पहले कोड ब्लॉक में किया था। –
'कम करें' सिर्फ एक 'के लिए' है जो अगले पुनरावृत्ति के लिए एक मूल्य गुजर रहा है। यदि आप शॉर्ट सर्किटिंग चाहते हैं, तो आपको इसका समर्थन करने वाले उच्च ऑर्डर फ़ंक्शन का उपयोग करना होगा। या 'कम करें' का अपना संस्करण लिखें। इस मामले में मुझे लगता है कि 'कम करने' का उपयोग करना बहुत खराब विकल्प है क्योंकि आप वास्तव में जमाकर्ता का उपयोग नहीं कर रहे हैं। – Sulthan