রিকার্সিভ ফাংশন হলো এমন ফাংশন যা নিজেকে কল করে।
একটি রিকার্সিভ ফাংশনে অন্তত একটি বেস কেস আর অন্তত একটি রিকার্সিভ কেস থাকা দরকার।
একটি বেস কেস ফাংশনটিকে আবার কল না করেই একটি মান রিটার্ন করে। একটি রিকার্সিভ কেস ফাংশনটিকে আবার কল করে, আর ইনপুটটি এমনভাবে বদলে দেয় যাতে কোনো এক সময় তা বেস কেসের সাথে মিলে যায়।
এখানে একটি উদাহরণ দেওয়া হলো, যা একটি অ্যারের এলিমেন্টগুলো গুনে।
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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।