2008-12-10 7 views
5

मैं पहचान इस के उत्पादन में स्पष्ट पैटर्न नहीं है कि, मैं सिर्फ जानना चाहता हूँ से संबंधित प्रश्न क्यों lispbox के आरईपीएल रोकता है जब मैं, इसके अलावा कुछ भी> 52. चलाने का प्रयास में सुधार लाने पर कोई सुझाव कोड स्वागत से अधिक हैं।^-^अजीब परियोजना यूलर 72 (तुतलाना)

(defun count-reduced-fractions (n d sum) 
    (setf g (gcd n d)) 
    (if (equal 1 d) 
     (return-from count-reduced-fractions sum) 
     (if (zerop n) 
      (if (= 1 g) 
       (count-reduced-fractions (1- d) (1- d) (1+ sum)) 
       (count-reduced-fractions (1- d) (1- d) sum)) 
      (if (= 1 g) 
       (count-reduced-fractions (1- n) d (1+ sum)) 
       (count-reduced-fractions (1- n) d sum))))) 

सभी मैं जब मैं फोन

(count-reduced-fractions 53 53 0)

है मिलता है, मूल्यांकन निरस्त

यह मेरे लिए बहुत मतलब नहीं है , यह मानते हुए कि यह सभी नंबरों पर चलाएगा (और सटीक परिणाम लौटाएगा) कि नीचे है, और है कि मैं (अगर मैं चाहता था) सकता है तुतलाना में एक समय में कागज, या एक लाइन पर मेरे सिर में 53 करते हैं। मैंने यह सुनिश्चित करने के लिए 53 से अधिक अलग-अलग संख्याओं पर भी परीक्षण किया है कि यह 53 के लिए विशिष्ट नहीं था। कुछ भी काम नहीं करता है।

+0

क्या आपके पाठ में अंक कुछ इंगित कर रहे हैं? – Svante

+0

यह एक स्माइली चेहरे की तरह है।^- ^,^_ ^, :), आदि आदि आदि –

+0

मैं इमोटिकॉन पता है, मैं "......" अंक का मतलब है। – Svante

उत्तर

0

शायद एक स्टैक ओवरफ़्लो (हे)।

+0

आप एक असली एक मतलब है? – Haoest

+0

यदि यह एक असली एक था, वह यकीन है कि यह गलत तरीके से फायदा उठाने में किया था। –

3

मेरा अनुमान है lispbox साथ एक अंतर्निहित ढेर गहराई सीमा नहीं है कि है। के बाद से कॉमन लिस्प पूंछ पुनरावर्ती कार्यों लगातार ढेर स्थान का उपयोग की गारंटी नहीं है, यह उस गिनती-कम-भिन्न के हर मंगलाचरण ढेर पर एक और परत कहते हैं संभव है।

वैसे, SBCL समस्या के बिना इस एल्गोरिथ्म चलाता है।

* (count-reduced-fractions 53 53 0) 
881 

* (count-reduced-fractions 100 100 0) 
3043 
1

शैली के मामले में, आप डी और योग वैकल्पिक बना सकते हैं।

(defun test (n &optional (d n) (sum 0)) ..) 
6

यह व्यवहार एक लापता पूंछ कॉल अनुकूलन पर संकेत देता है, ताकि आपका रिकर्स स्टैक को उड़ा सके। एक संभावित कारण यह है कि आपने डिबगिंग ऑप्टिमाइज़ेशन को अस्वीकार कर दिया है।

वैसे, आपको return-from पर स्पष्ट कॉल करने की आवश्यकता नहीं है। प्रस्तावित परिवर्तन की स्पष्टीकरण:: "योग" का अपना मूल्य है, जो हो जाता है का मूल्यांकन के बाद से sum एक स्वयं का मूल्यांकन प्रतीक है, तो आप इस लाइन

(return-from count-reduced-fractions sum)

sum

को संपादित बदल सकते हैं "if" कथन का वापसी मान, जो (क्योंकि यह defun में अंतिम विवरण है) फ़ंक्शन का वापसी मान बन जाता है।

संपादित करें: declaimed अनुकूलन के स्पष्टीकरण: आप अपने शीर्ष स्तर के लिए निम्न जोड़ सकते हैं:

(declaim (optimize (speed 3) 
        (debug 0)))

या एक ही उपयोग करें, लेकिन declare बजाय declaim अपने कार्य में पहला विवरण के साथ। यदि आप काम नहीं करते हैं तो आप (स्पेस 3) और (सुरक्षा 0) भी कोशिश कर सकते हैं।

पूंछ कॉल अनुकूलन का मतलब है कि एक समारोह कॉल जिसका वापसी मान सीधे लौटा दिया जाता है, प्रभावी रूप से एक पाश के लिए "सपाट" एक पुनरावर्ती समारोह कॉल, और पुनरावर्ती को नष्ट (बजाय स्टैकिंग का) स्टैक पर एक फ्रेम प्रतिस्थापन में अनुवादित किया गया फ़ंक्शन कॉलयह डिबगिंग को थोड़ा कठिन बनाता है, क्योंकि वहां कोई फ़ंक्शन कॉल नहीं होती है जहां आप उन्हें उम्मीद करते हैं, resp। आप नहीं जानते कि एक रिकर्सन में "गहरा" कैसे एक त्रुटि होती है (जैसे कि आपने एक लूप लिखा था)। आपका पर्यावरण कुछ डिफ़ॉल्ट घोषणाएं कर सकता है जिन्हें आपको टीसीओ सक्षम करने के लिए ओवरराइड करना है।

संपादित करें: बस इस प्रश्न का पुनरीक्षण, g क्या है? मुझे लगता है कि आप वास्तव में

(let ((g (gcd n d))) 
    ;; ... 
) 
+0

प्रतीत होता है कि समारोह के जीवन का विस्तार करने के लिए है, लेकिन बहुत ज्यादा नहीं है। –

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