2011-08-13 7 views
6

मैं को हल करने की कोशिश कर रहा हूं4clojure.com पर एक अनुक्रम की गणना करें। व्यायाम count फ़ंक्शन का उपयोग किए बिना संग्रह में तत्वों की संख्या को गिनना है।क्लोजर में सशर्त होने पर मैं रिकर कैसे कॉल कर सकता हूं?

मैंने सोचा कि मैं इसे rest के उपयोग से रिकर्सन के माध्यम से कर सकता हूं। अगर मुझे जो मिलता है वह खाली नहीं है, तो मैं 1 + recur on the sequence rest returned लौटाता हूं। समस्या यह है कि मैं भले ही मैं recur आखिरी बयान के रूप में फोन कर रहा हूँ

java.security.PrivilegedActionException: java.lang.UnsupportedOperationException: 
Can only recur from tail position 

हो रही अंत है।

(fn [coll] (let [tail (rest coll)] 
      (if (empty tail) 
       1 
       (+ 1 (recur tail))))) 

क्या मुझे कुछ याद आ रही है?

उत्तर

8

अंतिम विवरण अतिरिक्त है, recur पर कॉल नहीं, यही कारण है कि यह काम नहीं करता है। तथ्य यह है कि अगर अंदर है तो इसके साथ कुछ लेना देना नहीं है। (fn [coll] (let [tail (rest coll)] (+ 1 (recur tail)))) या तो काम नहीं करेगा।

इस तरह के फ़ंक्शन को पूंछ-पुनरावर्ती में बदलने का सामान्य तरीका यह है कि फ़ंक्शन को दूसरा तर्क दें, जिसमें आपके द्वारा जोड़े जा रहे मूल्य के लिए जमाकर्ता है और फिर इस तरह की पुन: साझा करें: (recur tail (+ acc 1))recur के परिणाम में 1 जोड़ने की कोशिश कर रहा है।

एक सामान्य नियम के रूप में: यदि आप recur (उदाहरण के लिए इसमें 1 जोड़ना) के परिणामस्वरूप कुछ भी कर रहे हैं, तो यह पूंछ की स्थिति में नहीं हो सकता है, इसलिए यह काम नहीं करेगा।

6

जो त्रुटि आप प्राप्त कर रहे हैं वह यह इंगित कर रही है कि (+ 1 (recur tail)) की आपकी अंतिम अभिव्यक्ति पूंछ-कॉल-अनुकूलन अनुकूलन योग्य नहीं है (क्या यह एक शब्द है?)। समस्या यह है कि फ़ंक्शन के परिणाम का मूल्यांकन करने के लिए इसे स्टैक पर (+ 1 ...) अभिव्यक्तियों का समूह रखना होगा। टेल कॉल ऑप्टिमाइज़ेशन केवल तभी हो सकता है जब कॉल किए गए फ़ंक्शन का मान केवल कॉल करने वाले फ़ंक्शन की वापसी को जानने के लिए आवश्यक हो।

जो आप लिखने की कोशिश कर रहे हैं वह काफी fold है। इस मामले में फ़ंक्शन को शेष संग्रह के साथ-साथ गिनती के साथ पास होना चाहिए।

(fn [count coll] (let [tail (rest coll)] 
    (if (empty tail) 
     count 
     (recur (+ 1 count) tail))))) 
संबंधित मुद्दे