নিজের সাপেক্ষে কোনো কিছুকে সংজ্ঞায়িত করার ক্ষমতাকে রিকারশন বলা হয়। F#-এ রিকারশন সবচেয়ে বেশি রিকারসিভ ফাংশনে দেখা যায়, যেগুলো নিজেদের কল করে।
একটি রিকারসিভ ফাংশনে অন্তত একটি বেস কেস এবং অন্তত একটি রিকারসিভ কেস থাকতে হয়। একটি বেস কেস ফাংশনটিকে আবার কল না করেই একটি মান রিটার্ন করে। একটি রিকারসিভ কেস ফাংশনটিকে আবার কল করে এবং ইনপুট পরিবর্তন করে, যাতে সেটি একসময় বেস কেসের সাথে মিলে যায়।
রিকারসিভ ফাংশন সাধারণ ফাংশনের মতোই ডিফাইন করা হয়, তবে rec মডিফায়ার-সহ। এই মডিফায়ার ছাড়া একটি ফাংশন নিজেকে কল করতে পারবে না, এবং এরকম করার কোনো চেষ্টা করলে কম্পাইলেশন এরর হবে। তাই রিকারশনকে স্পষ্টভাবে বেছে নিতে হয়।
let rec factorial x =
// Base case
if x = 1 then
1
// Recursive case
else
x * factorial (x - 1)
F# ডিসক্রিমিনেটেড ইউনিয়ন টাইপের মাধ্যমে রিকারসিভ টাইপও সমর্থন করে। একটি রিকারসিভ ডিসক্রিমিনেটেড ইউনিয়ন টাইপের এক বা একাধিক কেস তাদের ডেটাতে ডিসক্রিমিনেটেড ইউনিয়ন টাইপটিকেই রেফার করে। রিকারসিভ ফাংশনের মতোই, রিকারসিভ টাইপেও একটি বেস কেস থাকতে হয়। রিকারসিভ ফাংশনের বিপরীতে, রিকারসিভ টাইপ rec কিওয়ার্ড ব্যবহার করে না।
type RussianDoll =
| Doll // Base case
| Layer of RussianDoll // Recursive case
এই অনুশীলনীতে আপনি একটি পিৎজার দোকানে কাজ করছেন, যেটি গ্রাহকদের কাছে পিৎজা পৌঁছে দেয়।
আপনি তিন ধরনের পিৎজা দেন:
গ্রাহকেরা সামান্য অতিরিক্ত ফি-তে আরও দুটি অতিরিক্ত অপশনও বেছে নিতে পারেন:
গ্রাহকেরা অর্ডার দিলে, তারা যদি মাত্র একটি বা দুটি পিৎজা অর্ডার করে, তাহলে একটি অতিরিক্ত ফি যোগ হয়:
আপনার তিনটি কাজ আছে, যার প্রতিটিতে পিৎজা এবং তার দাম নিয়ে কাজ করতে হবে।
পিৎজার ধরন এবং একটি পিৎজায় যোগ করা যায় এমন দুটি অতিরিক্ত অপশন বোঝাতে Pizza ডিসক্রিমিনেটেড ইউনিয়নটি ডিফাইন করুন:
MargheritaCapreseFormaggioExtraSauceExtraToppingsএকটি পিৎজার দাম হিসাব করতে pizzaPrice ফাংশনটি ইমপ্লিমেন্ট করুন:
pizzaPrice Caprese
// => 9
একটি পিৎজা অর্ডারের দাম হিসাব করতে orderPrice ফাংশনটি ইমপ্লিমেন্ট করুন:
orderPrice [Margherita; Formaggio]
// => 19
Exercism-এ সাইন আপ করুন, F# ট্র্যাকের 18টি কনসেপ্ট148টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।