2009-07-23 9 views
49

मैं बस एसआईसीपी (स्वयं के लिए; यह कक्षा के लिए नहीं है) के माध्यम से काम करना शुरू कर रहा हूं, और मैं कुछ दिनों के लिए व्यायाम 1.6 के साथ संघर्ष कर रहा हूं और मुझे लगता है कि मैं इसे समझ नहीं पा रहा हूं । यह एक जहां एलिसा है cond के मामले में फिर से परिभाषित करता है if, इसलिए जैसे:एसआईसीपी में व्यायाम 1.6 के लिए स्पष्टीकरण क्या है?

(define (new-if predicate then-clause else-clause) 
    (cond (predicate then-clause) 
      (else else-clause)) 

वह कुछ सरल मामलों पर सफलतापूर्वक यह परीक्षण, और फिर इसे का उपयोग करता है वर्गमूल कार्यक्रम (जो सिर्फ काम फिर से लिखने के लिए if के साथ ठीक):

(define (sqrt-iter guess x) 
    (new-if (good-enough? guess x) 
      guess 
      (sqrt-iter (improve guess x) 
         x))) 

सवाल तो उससे पूछा "जब एलिसा इस वर्ग जड़ों की गणना करने के बारे में बताएं उपयोग करने का प्रयास तो क्या होगा?।" [यदि आवश्यक हो, तो मुझे अन्य प्रक्रियाओं (good-enough?, improve इत्यादि) को पुन: उत्पन्न करने में प्रसन्नता हो रही है), बस मुझे बताएं।]

अब, मुझे पता है कि क्या होता है: यह कभी भी मूल्य नहीं देता है, जिसका अर्थ है कि कार्यक्रम असीम रूप से recurses। मैं बस यह नहीं समझा सकता कि ऐसा क्यों होता है। if और new-if के बीच जो भी सूक्ष्म अंतर मौजूद है, वह मुझे दूर कर रहा है। किसी भी और सभी मदद की बहुत सराहना की।

+1

"रिकर्सिव" का क्रिया रूप "रिकर्स" है, इसलिए यह "रिकर्स" होता है। –

+0

आपका प्रश्न शीर्षक गलत है: आप व्यायाम 1.6 का जिक्र कर रहे हैं, 1.4 नहीं। – systemovich

+1

@ गेफरी वान विक आप सही हैं। जब मैंने सवाल लिखा था, मैं एसआईसीपी के पहले संस्करण की अपनी पुरानी प्रति के माध्यम से काम कर रहा था, जिसमें यह समस्या व्यायाम 1.4 के रूप में दिखाई देती है। दूसरे संस्करण में, यह व्यायाम 1.6 है। मैं बदलाव करूंगा। –

उत्तर

62

new-if एक फ़ंक्शन है। जब कोई फ़ंक्शन कहा जाता है, तो पहली बात क्या है कि योजना तर्क सूची के साथ होती है? यह सभी तर्कों का मूल्यांकन करता है।

20

सबसे पहले आपको आवेदक आदेश मूल्यांकन और सामान्य आदेश के बीच understand the difference होना है। लिस्प अनुप्रयोगी क्रम का उपयोग करता है, लेकिन सशर्त भाव सामान्य कार्यों (sicp chapter 1.1.6) की तरह नहीं मूल्यांकन किया जाता है:

(if <predicate> <consequent> <alternative>) 

एक अभिव्यक्ति है, दुभाषिया अभिव्यक्ति की <predicate> हिस्सा मूल्यांकन द्वारा शुरू होता है मूल्यांकन करने के लिए। यदि <predicate> एक वास्तविक मूल्य का मूल्यांकन करता है, तो दुभाषिया फिर <consequent> का मूल्यांकन करता है और इसका मूल्य देता है। अन्यथा यह <alternative> का मूल्यांकन करता है और इसका मूल्य देता है।

28

new-if एक प्रक्रिया है, और योजना अनुप्रयोगी-आदेश मूल्यांकन (1.1.5), तो इससे पहले कि यहां तक ​​कि new-if वास्तव में किया जाता है, यह सभी तर्क पहले, जो guess और (sqrt-iter (improve guess x) x) हैं मूल्यांकन करने के लिए उपयोग करता है। आप देख सकते हैं कि बाद वाला तर्क एक रिकर्सन है, जो एक नई new-if प्रक्रिया को कॉल करता है, इस प्रकार अनंत लूप होता है।

सामान्य if को पहले अपने तर्कों का मूल्यांकन करने की आवश्यकता नहीं है, बस रास्ते में जाएं, यह if और new-if के बीच का अंतर है। :)

+0

'नई-अगर' प्रक्रिया में तीन तर्क हैं: 'predicate', 'then-clause' और' else-clause'। तो जब 'नया-अगर' कहा जाता है, '(अच्छा-पर्याप्त? अनुमान x) ',' अनुमान ', और' (वर्ग-इटर (अनुमान एक्स में सुधार)) का मूल्यांकन किया जाता है। क्या वह सही है ? यह परिणाम नहीं बदलता है क्योंकि केवल 'sqrt-iter' का मूल्यांकन परेशानी का कारण बनता है। लेकिन आईएमओ आप एक तर्क भूल गए ... –

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

  • कोई संबंधित समस्या नहीं^_^