/ / यूलर # 1 के लिए क्लीजिंग समाधान को सामान्य बनाना - क्लोजर, फंक्शनल-प्रोग्रामिंग

यूलर # 1 - क्लोजर, फंक्शनल-प्रोग्रामिंग के लिए क्लीजिंग समाधान को सामान्य बनाना

Q = 1000 से नीचे 3 या 5 के सभी गुणकों का योग ज्ञात कीजिए।

सरलतम उत्तर

(reduce + (filter #(or (== (mod % 3) 0) (== (mod % 5) 0)) (range 1000)))

निम्नलिखित जैसे सामान्य उत्तर के लिए कोशिश कर रहा है

(reduce + (list-nums-divisible-by-all-divisors N div1 div2 ...))
(defn list-nums-divisible-by-all-divisors
[num & divisors]
(let [myfn (create-fn divisors)]
(filter myfn (range num))))

यहाँ 2 divenders के लिए बनाएँ fn है

(defn create-fn
[div1 div2]
#(or (== (mod % div1) 0) (== (mod % div2) 0)))

मैं विभाजक की चर संख्या के लिए create-fn कैसे लिखूंगा?

क्या इससे निपटने के लिए यह सही तरीका है? मुझे लग रहा है कि मुझे शायद इस तरह के बजाय -> या - >> ऑपरेटर का उपयोग करना चाहिए।

इसके अलावा, मुझे लगता है कि यह एक सामान्य सवाल है।क्या कोई फ़ंक्शन किसी चर संख्या का उपयोग करके एक फ़ंक्शन बना और वापस कर सकता है, जिसे बाद में एक अनाम फ़ंक्शन (तर्कों के अन्य स्तर के साथ) के रूप में उपयोग किया जा सकता है?

अग्रिम में धन्यवाद :-)

उत्तर:

जवाब के लिए 2 № 1

मैं थोड़ा अधिक दानेदार बनाने की सलाह देता हूं, कई विधेय बनाता है और फिर उनका उपयोग करके संयोजन करता हूं every-pred। यह फ़ंक्शन बहुत सुविधाजनक रूप से कई में से एक को समर्पित करता है।

सबसे पहले, एक विभाजित विभाज्यता फ़ंक्शन के साथ शुरू करें:

(defn divisible-by? [n]
(fn [x]
(zero? (rem x n))))

करीने का अर्थ केवल यह है कि एक फ़ंक्शन "दो तर्क लेने" के लिए, हम पहले एक तर्क को स्वीकार करते हैं और फिर एक फ़ंक्शन का निर्माण करते हैं जो दूसरा तर्क लेता है। इनका उपयोग किया जाता है

((divisible-by? 3) 6) ;;-> true

इस मामले में हम वह व्यवहार चाहते हैं क्योंकि हम चाहते हैं map एक फ़ंक्शन जो एकात्मक विधेय बनाता है, जैसे:

(defn create-fn [divisors]
(apply every-pred (map divisible-by? divisors)))