2013-02-02 22 views
6

मैं प्रत्यावर्तन के बारे में अध्ययन कर रहा था और मैं इस सवाल में आए:किसी भाषा को रिकर्सन का समर्थन करने के लिए कितनी संपत्तियां होनी चाहिए?

FORTRAN implementations do not permit recursion because 

a. they use static allocation for variables 

b. they use dynamic allocation for variables 

c. stacks are not available on all machines 

d. it is not possible to implement recursion on all machines. 

मुझे पता चला है कि जवाब था (क)

लेकिन मुझे लगता है कि एक प्रोग्रामिंग भाषा के लिए होनी चाहिए सभी सुविधाओं जानना चाहता हूँ रिकर्सन का समर्थन करें।

किसी एक समारोह या सबरूटीन (अपनी वापसी पते सहित) में

+0

सहमत, प्रश्न के लिए स्वागत है और प्रश्न के लिए धन्यवाद। हिरण हंटर ने सब कुछ गूंजने के लिए कहा, हमारे पास इस समुदाय में बहुत से फ़ोरट्रान उपयोगकर्ता हैं, लेकिन हम आम तौर पर इस तरह के सामान्य प्रोग्रामिंग प्रश्नों को संभाल नहीं पाते हैं। मैं इसे एक स्टैक ओवरफ्लो पर ले जा रहा हूं। –

+0

ठीक है मुझे मिल गया। –

+2

की चाल के लिए धन्यवाद मुझे लगता है कि आपको केवल एक चीज चाहिए: कार्य और स्थानीय चर और तर्क फ़ंक्शन स्थान प्रति फ़ंक्शन आमंत्रण। प्वाइंट ए। आपके प्रश्न में यह सुझाव दिया गया है कि स्टोरेज स्पेस फ़ंक्शन इनवॉक्शंस में पुन: उपयोग किया जाता है। – jackrabbit

उत्तर

4

स्थानीय चर पहले से मेरी संदेह का समाधान कृपया

धन्यवाद जब भी यह कहा जाता है ताज़ा प्रति होना चाहिए।

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

अन्य भाषाएं भौतिक हार्डवेयर स्टैक का उपयोग नहीं करती हैं, लेकिन एक लॉजिकल एक लिंक की गई सूची के रूप में लागू होती है, लेकिन सिद्धांत समान है।

चूंकि मूल फोर्ट्रानों में यह अवधारणा नहीं थी, और निश्चित वैश्विक स्थानों पर सभी चरों को संग्रहीत किया गया था, एक रिकर्सिव कॉल क्रैश या लटका होगा। उदाहरण के लिए, यदि कोई कॉल बी कॉल करता है तो बी कॉल करता है, तो बी सी पर वापस आती है, जो बी पर लौटती है, जो सी, विज्ञापन infinitum पर लौटती है, क्योंकि बी केवल एक रिटर्न पता याद कर सकता है।

calls: A -> B -> C -> B 

returns:  B <- C <- B 
      B -> C 

इतना ही नहीं, सभी स्थानीय चर और बी के लिए पहली कॉल के तर्कों clobbered कर रहे हैं जब बी को दूसरी कॉल होता है।

1

प्रश्नकर्ता पूछने वाले बहु-विकल्प प्रश्न एक भ्रामक सवाल है, क्योंकि भाषा के सबसे पुराने संस्करणों में रिकर्सन समर्थन की कमी है, फ़ोरट्रान भाषा के आधुनिक संस्करण हैं जो पुनरावृत्ति की अनुमति देते हैं।

क्या भाषा कार्यान्वयन पुनरावृत्ति का समर्थन करता है, इस बात को इस बात पर विचार किया जाना चाहिए कि भाषा की बोली कार्य को परिभाषित करती है, और कार्यान्वयन की अनुरूपता की डिग्री है।