2009-01-18 26 views
6

"संरचना और कंप्यूटर प्रोग्राम की व्याख्या" Clojure साथ में व्यायाम 1.16 (तेजी से exp की पुनरावृत्ति संस्करण) करने के लिए कोशिश कर रहा है मैं इस के साथ आया था:मूल्यांकन

user=> (fast-it-exp 0 0 10) 
10 ;yep 
user=> (fast-it-exp 2 2 2) 
1  ;no... 
user=> (fast-it-exp 1 1 1) 
#<user$fast_it_exp__59 [email protected]63> ;huh?! 

लगता है कि कंड अभिव्यक्ति का "विषम" भाग मूल्यांकन के बजाए एक फ़ंक्शन देता है। क्यूं कर? मैंने भविष्यवाणियों के बाद अभिव्यक्तियों के चारों ओर कोष्ठक डालने का प्रयास किया है, लेकिन यह गलत वाक्यविन्यास प्रतीत होता है, यह सबसे अच्छा है जिसके साथ मैं आने में सक्षम हूं। मैं क्लोजर के संशोधित 1146 का उपयोग कर रहा हूं।

+0

आप एक समारोह को लागू करना चाहते हैं, तो यह शायद के बाईं ओर एक आरंभिक कोष्ठक के लिए मिला अपने आप। और आपकी आखिरी पंक्ति में ''fast-it-exp' से पहले' नहीं है और न केवल अंतिम पंक्ति में ... –

उत्तर

11

इस प्रयास करें:

(defn fast-it-exp [base exp res] 
    (cond (= exp 0) res 
     (odd? exp) (fast-it-exp base (- exp 1) (* base res)) 
     :else (fast-it-exp base (/ exp 2) (* base base res)))) 

मुझे कोई आरईपीएल आसान है, लेकिन है कि आप क्या चाहते तरह दिखता है।

(defn fast-it-exp [base exp res] 
    (cond 
    (= exp 0) res 
    (odd? exp) fast-it-exp 
    base (- exp 1) 
    (* base res) :else 
    fast-it-exp base 
    (/ exp 2) (* base base res))) 

तो:

+0

क्या मैंने सोचा था कि मैंने ब्रांड्स के सभी संभावित क्रमिक प्रयासों का प्रयास किया था, लेकिन ऐसा लगता है कि मुझे सही याद आया एक। यह काम किया, बहुत फिलिप धन्यवाद। :) –

+0

अहम। कोष्ठक की अनुमति क्यों? यदि आप लिस्प में कोई फ़ंक्शन कॉल करना चाहते हैं, तो उसे सूची का पहला तत्व होना चाहिए; इस प्रकार लिस्प वाक्यविन्यास काम करता है। – Svante

+0

अनुमान के बाद क्लोजर कोष्ठक में वैकल्पिक हैं, जैसा ऊपर (= exp 0) उदाहरण के बाद है। बिना कोशिश की, लेकिन वह वाक्यविन्यास संदिग्ध था। कोशिश की, लेकिन मेरे पास एक कोष्ठक हो सकता था: अन्यथा जो गलत था। सोचा था कि मैंने फिलिप के संस्करण की भी कोशिश की थी, लेकिन कुछ गलत किया होगा। –

6

असल में, क्या आप ने लिखा के रूप में पुन: स्वरूपित किया जा सकता है

user=> (fast-it-exp 0 0 10) ; (= exp 0) => res 
10 ;yep 
user=> (fast-it-exp 2 2 2) ; base => (- exp 1) 
1  ;no... 
user=> (fast-it-exp 1 1 1) ; (odd? exp) => fast-it-exp 
#<user$fast_it_exp__59 [email protected]> ;huh?! 
+0

आह, मैं देखता हूं, जो मूल व्यवहार बताता है, धन्यवाद। इसके अलावा मैं गणित को सही ढंग से करने में कामयाब रहा हूं, हे। *शरमाना* –

संबंधित मुद्दे