एक ज्ञापन क्लोजुरियन के रूप में ज्ञापन, यह recommended to me था कि मैं Project Euler समस्याओं को भाषा सीखने के तरीके के रूप में देखता हूं। यह आपके कौशल को बेहतर बनाने और आत्मविश्वास हासिल करने का एक शानदार तरीका है। मैंने अभी अपना जवाब problem #14 पर पूरा कर लिया है। यह ठीक काम करता है, लेकिन इसे कुशलतापूर्वक चलाने के लिए मुझे कुछ ज्ञापन लागू करना पड़ा। मैं अपने कोड को संरचित करने के तरीके के कारण प्रीपेक्स्ड memoize
फ़ंक्शन का उपयोग नहीं कर सका, और मुझे लगता है कि यह मेरे स्वयं के किसी भी तरह से रोल करने का अच्छा अनुभव था। मेरा सवाल यह है कि अगर मेरे कैश को फ़ंक्शन के भीतर ही एन्सेप्लेट करने का कोई अच्छा तरीका है, या यदि मुझे बाहरी कैश को परिभाषित करना है जैसे मैंने किया है। इसके अलावा, मेरे कोड को अधिक बेवकूफ बनाने के लिए कोई सुझाव की सराहना की जाएगी।प्रोजेक्ट यूलर # 14 और क्लोजर
(use 'clojure.test)
(def mem (atom {}))
(with-test
(defn chain-length
([x] (chain-length x x 0))
([start-val x c]
(if-let [e (last(find @mem x))]
(let [ret (+ c e)]
(swap! mem assoc start-val ret)
ret)
(if (<= x 1)
(let [ret (+ c 1)]
(swap! mem assoc start-val ret)
ret)
(if (even? x)
(recur start-val (/ x 2) (+ c 1))
(recur start-val (+ 1 (* x 3)) (+ c 1)))))))
(is (= 10 (chain-length 13))))
(with-test
(defn longest-chain
([] (longest-chain 2 0 0))
([c max start-num]
(if (>= c 1000000)
start-num
(let [l (chain-length c)]
(if (> l max)
(recur (+ 1 c) l c)
(recur (+ 1 c) max start-num))))))
(is (= 837799 (longest-chain))))
बस प्रोजेक्ट यूलर के लिए मुझे उजागर करने के लिए धन्यवाद देना चाहता था। मैं भी क्लोजर सीखने की कोशिश कर रहा हूं। –
बेहद मामूली बिंदु, लेकिन (इंक सी) शायद (+ 1 सी) से अधिक मूर्खतापूर्ण है। –