2010-09-17 7 views
14

मुझे यकीन है कि अगर यह एक बेवकूफ सवाल यह है कि नहीं हूँ, लेकिन मैं ट्यूटोरियल कि VS 2010 के साथ आता है के माध्यम से जा रहा था और वहाँ इस तरह एक समारोह है:एफ # में रिक के रूप में रिकर्सिव फ़ंक्शन को चिह्नित करने का क्या कारण है?

let rec factorial n = if n=0 then 1 else n * factorial (n-1) 

क्या इस पुनरावर्ती क्रिया के कारण के साथ चिह्नित किया जाना है आरईसी कीवर्ड?

क्या ऐसा है कि संकलक को आश्वस्त होने का आश्वासन दिया जाता है ताकि कुछ अनुकूलन कर सकें?

यदि आप इसे बहिष्कृत करते हैं तो क्या होता है?

+0

शायद डुप्लिकेट? http://stackoverflow.com/questions/900585/why-are-functions-in-ocaml-f-not-recursive-by-default – Stringer

+1

धन्यवाद वे समान दिखते हैं, वह भी पढ़ेंगे। –

उत्तर

27

यह शिक्षाप्रद हो सकता है:

let Main() = 
    let f(x) = 
     printfn "original f: %d" x 
    let f(x) = 
    //let rec f(x) = 
     printfn "entered new f: %d" x 
     if x > 0 then 
      f(x-1) 
     else 
      printfn "done" 
    f(3) 
Main() 

कि

entered new f: 3 
original f: 2 

प्रिंट अब अगर हम let और टिप्पणी हटाएं let rec बाहर टिप्पणी है, तो इसके बारे में उस बिंदु से

entered new f: 3 
entered new f: 2 
entered new f: 1 
entered new f: 0 
done 

तो प्रिंट देखें, यह सिर्फ बाध्यकारी नाम के बारे में है; let rec पहचानकर्ता को तुरंत दायरे में डालता है (इस उदाहरण में, पिछले f को छायांकन), जबकि let पहचानकर्ता को उसके शरीर को परिभाषित करने के बाद ही दायरे में रखता है।

नियम के लिए प्रेरणा प्रकार अनुमान के साथ बातचीत से स्टेम होती है।

+2

यह बाध्यकारी, छायांकन और स्कोपिंग पर एक बहुत ही शिक्षित उदाहरण है :-)। –

+3

+1 लेकिन "नियम के लिए प्रेरणा टाइप अनुमान के साथ बातचीत से उत्पन्न होती है" कुछ स्पष्टीकरण के साथ कर सकती है। –

8

MSDN के अनुसार, यह केवल एक syntatic आवश्यकता है:

रिकर्सिव काम करता है, काम करता है कि खुद को कॉल, एफ # भाषा में स्पष्ट रूप से पहचाने जाते हैं। यह होने वाली पहचान को फ़ंक्शन के दायरे में उपलब्ध परिभाषित करता है।

http://msdn.microsoft.com/en-us/library/dd233232.aspx

+0

+1 यह सही पाने के लिए यहां एकमात्र उत्तर होने के लिए +1 है। –

11

क्रिस स्मिथ के अनुसार (एफ # टीम पर काम करता है) -

यह प्रकार निष्कर्ष प्रणाली सूचित करने के लिए समारोह प्रकार निष्कर्ष की प्रक्रिया के हिस्से के रूप में इस्तेमाल किया जा करने की अनुमति है। रिक इनसेक्शन सिस्टम ने फ़ंक्शन के प्रकार

+0

अन्यथा प्रकार अनुमान प्रणाली एक अनंत लूप में जाएगी? यदि ऐसा है, तो समझ में आता है। –

+1

वास्तव में, क्या यह सब है? इस बिंदु को लेकर, मुझे आश्चर्य है कि क्या मैं एक रिकर्सिव फ़ंक्शन * बिना * 'rec' लिख सकता हूं यदि मैं स्पष्ट रूप से सभी प्रकारों को परिभाषित करता हूं ... प्रयोग का समय! – sholsapp

+4

'आरईआर' के बिना, आपको पहले से ही फ़ंक्शन को परिभाषित करना होगा। लेकिन आपको पहले फ़ंक्शन को परिभाषित करना होगा, क्योंकि यह अपने दायरे में उपलब्ध नहीं होगा। लेकिन सबसे पहले, आपको फ़ंक्शन को परिभाषित करना होगा। फ़ंक्शन को परिभाषित करने के बाद। एक बार समारोह परिभाषित किया गया था। जो समारोह को परिभाषित करने की आवश्यकता होगी। * विज्ञापन infinitum। * – cHao

5

को निर्धारित करने से पहले फ़ंक्शन को कॉल करने की अनुमति दी है, यह आवश्यक है कि फ़ंक्शन रिकर्सिव हो। एक गैर-rec फ़ंक्शन केवल उस स्थान पर बाइंडिंग के बारे में जानता है जहां इसे परिभाषित किया गया है, इसके बाद नहीं (इसलिए यह स्वयं के बारे में नहीं जानता)।

+0

धन्यवाद चक। बाइंडिंग से आपका क्या मतलब है? क्या यह स्कोपिंग की तरह है? –

+3

@ जोन वेंग: एक बाध्यकारी मूल रूप से एक चर नाम और इसके संबंधित मूल्य है। इस मामले में इसका मतलब है कि आप अपने अंदर के फ़ंक्शन का उपयोग नहीं कर सकते हैं, क्योंकि यह केवल 'let' के बाद * नाम से जुड़ा हुआ है। 'रिकॉर्ड्स उन नामों को बनाता है जो बाध्यकारी अभिव्यक्ति के अंदर * बाध्य उपलब्ध हैं। –

+0

@ जोर्ग, धन्यवाद जो समझ में आता है। –

4

रिकर्स कीवर्ड के साथ इस रिकर्सिव फ़ंक्शन को चिह्नित करने का क्या कारण है?

कंपाइलर को बताने के लिए कि फ़ंक्शन के शरीर के अंदर फ़ंक्शन नाम का कोई भी उपयोग उसी नाम के पहले परिभाषित मान के बजाय इसे दोबारा संदर्भित करता है।

क्या ऐसा है कि संकलक को आश्वस्त होने का आश्वासन दिया जाता है ताकि कुछ अनुकूलन कर सकें?

सं

यदि आप इसे बाहर निकालने के तो क्या होगा?

आप अपने फ़ंक्शन बॉडी में स्वयं को संदर्भित करने के लिए परिभाषित किए गए फ़ंक्शन की क्षमता खो देते हैं और उसी नाम के पहले परिभाषित मानों को संदर्भित करने की क्षमता प्राप्त करते हैं।

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

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