टीएल; डीआर: क्या कार्यात्मक भाषाएं गैर-कार्यात्मक लोगों की तुलना में पुनरावृत्ति को बेहतर तरीके से संभालती हैं?
मैं वर्तमान में कोड पूरा 2 पढ़ रहा हूं। पुस्तक के कुछ बिंदु पर, लेखक हमें पुनरावृत्ति के बारे में चेतावनी देता है। उनका कहना है कि जब संभव हो तो इसे टाला जाना चाहिए और लय का उपयोग करके समाधान की तुलना में पुनरावृत्ति का उपयोग करने वाले कार्य आमतौर पर कम प्रभावी होते हैं। एक उदाहरण के रूप में, लेखक ने एक जावा फ़ंक्शन को पुनरावृत्ति का उपयोग करके संख्या की तथ्यात्मक गणना करने के लिए लिखा है, (यह बिल्कुल वैसा ही नहीं हो सकता है क्योंकि मेरे पास इस समय मेरे साथ पुस्तक नहीं है):
public int factorial(int x) {
if (x <= 0)
return 1;
else
return x * factorial(x - 1);
}
यह एक बुरा समाधान के रूप में प्रस्तुत किया गया है। हालांकि, कार्यात्मक भाषाओं में, पुनरावृत्ति का उपयोग करना अक्सर चीजों को करने का पसंदीदा तरीका है। उदाहरण के लिए, यहाँ पुनरावृत्ति का उपयोग करके हास्केल में फैक्टोरियल फ़ंक्शन है:
factorial :: Integer -> Integer
factorial 0 = 1
factorial n = n * factorial (n - 1)
और एक अच्छे समाधान के रूप में व्यापक रूप से स्वीकार किया जाता है। जैसा कि मैंने देखा है, हास्केल पुनरावृत्ति का बहुत बार उपयोग करता है, और मैंने कहीं भी यह नहीं देखा कि यह डूब गया है।
तो मेरा प्रश्न मूल रूप से है:
- क्या कार्यात्मक भाषाएं गैर-कार्यात्मक लोगों की तुलना में पुनरावृत्ति को बेहतर तरीके से संभालती हैं?
संपादित करें: मुझे पता है कि मैंने जिन उदाहरणों का उपयोग किया है, वे मेरे प्रश्न का वर्णन करने के लिए सर्वश्रेष्ठ नहीं हैं। मैं सिर्फ यह बताना चाहता था कि हास्केल (और सामान्य रूप से कार्यात्मक भाषा) गैर-कार्यात्मक भाषाओं की तुलना में बहुत अधिक बार पुनरावृत्ति का उपयोग करता है।
factorial n = product [1..n]
अधिक रसीला है, अधिक कुशल है, और बड़े के लिए स्टैक को अतिप्रवाह नहीं करता है n
(और यदि आपको संस्मरण की आवश्यकता है, तो पूरी तरह से विभिन्न विकल्पों की आवश्यकता होती है)। product
कुछ के संदर्भ में परिभाषित किया गया है fold
, जिसे पुनरावर्ती रूप से परिभाषित किया गया है, लेकिन अत्यधिक देखभाल के साथ। प्रत्यावर्तन है एक स्वीकार्य समाधान समय के सबसे अधिक है, लेकिन यह अभी भी आसान यह गलत / करने से इनकी करना है।