2012-02-11 16 views
11

बस योजना के साथ शुरू किया। मुझे कंसोल पर प्रिंटिंग में समस्या है। एक साधारण सूची मुद्रण उदाहरण:योजना कंसोल प्रिंटिंग

(define factorial 
    (lambda (n) 
    (cond 
     ((= 0 n) 1) 
     (#t (* n (factorial (- n 1))))))) 

मैं n प्रिंट करना चाहते हैं, हर बार जब समारोह कहा जाता है। मुझे लगा कि मैं एक ही समारोह में ऐसा नहीं कर सकता? क्या मुझे एक और फ़ंक्शन कॉल करने की ज़रूरत है, इसलिए मैं प्रिंट कर सकता हूं?

उत्तर

22

योजना में मुद्रण display (और संभवतः, newline) पर कॉल करके काम करता है। चूंकि आप इसे किसी और के बाद अनुक्रमिक रूप से कॉल करना चाहते हैं (जो, एक कार्यात्मक (या योजना के मामले में, कार्यात्मक-आश) भाषा केवल बुलाए गए कार्यों के दुष्प्रभावों के लिए समझ में आता है), आपको आमतौर पर उपयोग करने की आवश्यकता होगी begin, जो बदले में अपने तर्कों का मूल्यांकन करता है और फिर अंतिम उप-संपीड़न का मूल्य देता है। हालांकि, lambda में निहित रूप से begin -expression शामिल है।

तो अपने मामले में, यह इस तरह जाना होगा:

(lambda (n) 
    (display n) (newline) 
    (cond [...])) 

दो टिप्पणी:

  1. आप (define factorial (lambda (n) [...])) के लिए एक आशुलिपि के रूप में उपयोग कर सकते हैं (define (factorial n) [...])
  2. जिस तरह से आप factorial लागू करते हैं tail call-optimization को रोकता है, इसलिए प्रोग्राम एन के बड़े मानों के लिए काफी स्टैक स्पेस का उपयोग करेगा। हालांकि, एक संचयक का उपयोग करके इसे एक अनुकूलनीय रूप में लिखना संभव है।

आप केवल एक बार n मुद्रित करने के लिए चाहते हैं, जब उपयोगकर्ता फ़ंक्शन को कॉल करने के लिए, आप वास्तव में, एक आवरण लिखने के लिए इस तरह की आवश्यकता होगी:

(define (factorial n) 
    (display n) (newline) 
    (inner-factorial n)) 

और फिर inner-factorial करने के लिए अपने समारोह नाम बदलें।

+0

आपको लैम्ब्डा शरीर के भीतर शुरुआत की आवश्यकता नहीं है। –

+0

ओह thx! लेकिन स्थिति के बाद मुद्रण के बारे में कैसे? मैं वास्तव में फैक्टोरियल पर काम नहीं कर रहा हूं, लेकिन इसके साथ यह समझना आसान है। कुछ प्रिंट केवल तभी प्रिंट करें जब स्थिति सही है, यानी अगर प्रिंट करें! = 0। – ercliou

+1

मैंने 'स्टार्ट' के बारे में हिस्सा तय किया। 'कंड'-क्लॉज के शरीर में कई अभिव्यक्तियां भी हो सकती हैं, ताकि आप आसानी से वहां 'प्रदर्शन' को कॉल कर सकें। – fnl

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