को सरल बनाने के लिए Idiomatic Haskell कोड मुझे foo n = maximumBy (comparing p) [1..n]
की गणना करने की आवश्यकता है, जहां p :: Int -> Int
धीमा है। लेकिन मुझे पता है कि p n < n
सभी n > 0
के लिए और इस गणना का उपयोग निम्न गणना को निम्न तरीके से करने के लिए करना चाहते हैं: n
से के साथ p x
की गणना करें, वर्तमान अधिकतम को याद करते हुए। एक बार जब मैं x
तक पहुंचता हूं तो वर्तमान अधिकतम के बराबर या बराबर, मुझे पता है कि यह अधिकतम वैश्विक होना चाहिए और मैं कर रहा हूं।रिकर्सन
तो मेरी प्रयास इस तरह दिखता है:
foo n = go (0, 0) n where
go (c, _) 1 = c
go (c, c') !x = if c' >= x then c else go (c2, c'2) (x-1) where
x' = p x
(c2, c'2) = if c' >= x' then (c, c') else (x, x')
यह काम करता है, लेकिन बहुत मुहावरेदार नहीं लगती है। तो मैं एक और अधिक सुरुचिपूर्ण समाधान की तलाश में हूं। क्या आपके पास सुझाव हैं?
जोड़ी से छुटकारा, यह 'xyn जाने ...', और मैं 'pn' एक नाम करने के लिए बाध्य होगा (डॉन संकलक को इसे पुन: सम्मिलित करने का मौका भी नहीं देते हैं), अन्यथा मैं यही करता हूं। सरल, स्पष्ट, कुशल। –
धन्यवाद, जोड़ी को प्रतिस्थापित करें जैसा कि आपने सुझाव दिया है कि यह निश्चित रूप से बेहतर है। वैसे भी, मुझे स्वीकार करना होगा कि मुझे एक चलो के उपयोग के बारे में संकोच है ... बाध्यकारी में क्योंकि मैं वास्तव में नहीं जानता कि मेरे दूसरे पैटर्न मिलान में, (पी एन) दो बार गणना की जाएगी या नहीं। अगर मुझे अपने कोड को औचित्य देना है, तो मैं तर्क दूंगा कि हास्केल प्रकृति से आलसी है, इसका मतलब यह है कि मूल्यांकन रणनीति कॉल-बाय-ज़रूरत है और परिभाषा के अनुसार "कॉल-बाय-ज़रूरत कॉल-बाय-नेम का एक ज्ञापन संस्करण है" तो यह ठीक होना चाहिए, नहीं? चूंकि यह सच है कि आपके द्वारा सुझाए गए बाध्यकारी में किसी भी स्थान को संदेह के लिए नहीं जाने दें, मैंने आपके नीचे अपना सुझाव जोड़ा है। – zurgl
मैं 'कहां' का उपयोग करूंगा। 'एक्स वाई एन जाओ | एन == 1 || एन <= वाई = एक्स | पीएन> वाई = जाओ एन पीएन (एन -1) | अन्यथा = x y (n-1) पर जाएं जहां pn = p n'। –