रिकर्शन फंक्शन ऐसे फंक्शन होते हैं जो खुद को कॉल करते हैं।
एक रिकर्शन फंक्शन में कम से कम एक बेस केस और कम से कम एक रिकर्शन केस होना ज़रूरी है।
बेस केस फंक्शन को दोबारा कॉल किए बिना एक वैल्यू लौटाता है। रिकर्शन केस फंक्शन को दोबारा कॉल करता है और इनपुट में ऐसा बदलाव करता है कि एक समय वह इनपुट बेस केस से मेल खाने लगे।
यहाँ एक उदाहरण है जो एक ऐरे के एलिमेंट गिनता है।
def count:
if length == 0 then
0 # base case
else
1 + (.[1:] | count) # recursive case
end;
([] | count), # => 0
([11, 22, 33] | count) # => 3
एक रिकर्शन फंक्शन में कई बेस केस और/या कई रिकर्शन केस हो सकते हैं। उदाहरण के लिए, फिबोनाची अनुक्रम एक ऐसा रिकर्शन अनुक्रम है जिसमें दो बेस केस होते हैं।
def fibonacci:
if . == 0 then
0
elif . == 1 then
1
else
(. - 1 | fibonacci) + (. - 2 | fibonacci)
end;
10 | fibonacci # => 55
किसी दी गई वैल्यू x को किसी ऐरे में कितनी बार आती है, इसे गिनने के दो रिकर्शन केस होते हैं।
def count_occurrences(x):
if length == 0 then
0
elif first == x then
1 + (.[1:] | count_occurrences(x))
else
(.[1:] | count_occurrences(x))
end;
[11, 22, 33, 22, 44] | count_occurrences(22) # => 2
व्यवहार में, ऐरे और दूसरे ऐसे डेटा स्ट्रक्चर पर इटरेशन करने के लिए अक्सर बिल्ट-इन फंक्शन इस्तेमाल होते हैं,
जैसे map और reduce, या फिर [.[] | select(...)] जैसी स्ट्रीम इस्तेमाल करके।
भीतर से देखें तो कुछ बिल्ट-इन फंक्शन रिकर्शन से बनाए गए हैं।
आप अभी-अभी एक ऐसी टीम में शामिल हुए हैं जो jq पर आधारित डेटा पाइपलाइन को बनाए रखती है।
अपने पहले पेयरिंग सेशन में आपके नए साथी को जिज्ञासा होती है:
क्या आपको पता है कि add, reverse और map अंदर से कैसे काम करते हैं? चलिए देखते हैं। कोशिश कीजिए और इन्हें खुद रिकर्शन से बनाइए, बिल्ट-इन का उपयोग किए बिना।
रिकर्शन का अभ्यास करने के लिए हम बिल्ट-इन add फिल्टर को फिर से बनाएँगे।
बेस केस यह है कि खाली ऐरे का जोड़ शून्य होता है।
इसे रिकर्सिव फंक्शन से खुद बनाइए। बिल्ट-इन add का उपयोग न कीजिए।
[5, 4, 6, 10] | array_add # => 25
हम बिल्ट-इन reverse फिल्टर को फिर से बनाएँगे।
बेस केस यह है कि खाली ऐरे को उलटने पर भी खाली ऐरे ही मिलता है।
इसे रिकर्सिव फंक्शन से खुद बनाइए। बिल्ट-इन reverse का उपयोग न कीजिए।
[5, 4, 6, 10] | array_reverse # => [10, 6, 4, 5]
हम बिल्ट-इन map फिल्टर को फिर से बनाएँगे।
यह फंक्शन एक फिल्टर को पैरामीटर के रूप में लेता है। फिर इनपुट ऐरे के हर एलिमेंट पर उस फिल्टर को चलाता है और उन सबके आउटपुट एक नए ऐरे में लौटाता है।
बेस केस यह है कि खाली ऐरे पर मैप करने से खाली ऐरे ही मिलता है।
इसे रिकर्सिव फंक्शन से खुद बनाइए। बिल्ट-इन map का उपयोग न कीजिए।
[5, 4, 6, 10] | array_map(. + 10) # => [15, 14, 16, 20]
Exercism पर साइन अप कीजिए और jq को 12 कॉन्सेप्ट75 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।