কেমন আছেন সবাই। আশা করি আল্লাহর রহমতে ভাল আছেন। আজ আমরা সি এর অতি গুরুত্বপূর্ন ব্যাপার নিয়ে আলোচনা করব।আর তা হল Recursion.
যখন কোন একটি ফাংশন এর মধ্য হতেই ঐ ফাংশনটিকে আবার কল করা হয় যতক্ষন না কোন স্পেসিফিক কন্ডিশন পূরন না হচ্ছে, তখন ঐ ধরনের কলকে recursion এবং ঐ ফাংশনটিকে recursive function বলা হয়। প্রোগ্রাম এর ক্ষেত্রে recursion এর ব্যবহার কোড অনেক ছোট ও সহজ করে তোলে। recursion যদিও সহজ তবে তা আয়ত্ব করতে এবং সঠিক প্রয়োগ ঘটাতে প্রয়োজন অনেক অনেক প্র্যাকটিস। আজ আমরা অল্প কিছু প্রবলেম recursion এর মাধ্যমে করব এবং তা ভালভাবে বোঝার চেস্টা করব।
এবার আমরা recursive function এর প্রথম প্রবলেমটা করব। ম্যাথম্যাটিক্স নিয়ে যাদের কিছুটা ধারনা আছে তারা অবশ্যই factorial সম্পর্কে জেনে থাকবেন। এখানে একবার উল্লেখ করছি।কোন সংখ্যার factorial হল 1 থেকে ঐ নাম্বার পর্যন্ত সকল সংখ্যার গুনফল।
n! = 1*2*3*4*....*n
3! = 1*2*3 = 6
5! = 1*2*3*4*5 = 120
exception: 0! = 1
এবার যেকোন নাম্বার এর factorial বের করার জন্য আমরা loop ব্যবহার করে বের করতে পারি।
যেমনঃ
for( i=res=1 ; i<=n ; i++ )
res=res*i;
printf(" factorial of %d : %d\n" , n, res );
উপরের কোডটি দিয়ে আমরা n এর factorial বের করতে পারি।
এই for loop এর কোডটা আমরা recursion এর মাধ্যমে করতে পারি। উল্লেখ্য, আমরা এখন যে উদাহরনটি করছি তা মূলত recursion বোঝার জন্য। এই প্রোগ্রাম দেখে হয়ত মনে হতে পারে recursion এর কি দরকার। recursion এর আরও অনেক প্রোগ্রাম আমরা দেখব পরে।
যখন কোন ফাংশন কল করা হয়, তখন যেখান থেকে কল করা হয়েছে সেখান থেকে সরাসরি জাম্প করে ফাংশন এ চলে যায়। আর তারপর ঐ ফাংশন এর কাজ শেষ হলে আবার কল এর জায়গায় ফিরে আসে। আর recursion এ যেহেতু একই ফাংশন হতে নিজেকেই আবার কল হয়, তাই ফাংশন কল শুধু depth এ যেতে থাকে।
নিচের ছবিটিতে উপরের উদাহরটি কিভাবে execute হচ্ছে তা দেখানো হল।
যখন প্রোগ্রামটি depth এ যেতে যেতে 0(zero) এর জন্য এক্সিকিউট হচ্ছে তখন ঐ ফাংশন এর স্পেসিফিক কন্ডিশন পূরন হওয়ায় তা ঐখান থেকে return করে যেখান থেকে কল করা হয়েছিল সেখানে ফিরে আসে।
এবার recursion apply করে আরেকটি প্রবলেম করি। আপনি একটি নাম্বার ইনপুট নিয়ে 1 থেকে ঐ নাম্বার পর্যন্ত প্রিন্ট করব এবং এদের যোগফল বের করব।
আপনারা যদি এর আগের উদাহরনটি কিভাবে কাজ করছে বুঝতে পারেন, ঠিক সেভাবে এটাও depth এ গিয়ে কিভাবে কাজ করছে তা ধরতে পারবেন।
আরেকটি উদাহরন করি। আপনি কোন স্ট্রিং এর reverse করবেন কোন loop ছাড়া। এটি recursion দিয়ে সহজে করা যায়।
এইটার সমাধান করার মূল কনসেপ্টটা হল যখন depth এ যেতে যেতে '\০' বা null character পাবে তখন return করার সময় একটি করে ক্যারেক্টার প্রিন্ট করবে। আর তার ফলে স্ট্রিংটিও রিভার্স অর্ডার এ প্রিন্ট হবে।
recursion ব্যবহার করে অনেক ধরনের কাজ খুব সহজে করা যায়। বিভিন্ন algorithm যেমনঃ sorting, searching প্রভৃতি ক্ষেত্রে recursion এর ব্যপক ব্যবহার। এখানে আমি মূলত recursion এর ক্ষেত্রে কি ঘটে তা দেখানোর চেস্টা করেছি। বিভিন্ন algorithm নিয়ে পরবর্তীতে আলোচনা করলে আবারও recursion তুলে ধরব।
এবার recursion দিয়ে একটি প্রবলেম করুন।
প্রবলেমঃ একটি integer array হতে highest number টি বের করে প্রিন্ট করুন।
আমার টিউন দেখে কেউ যদি উপকৃত হন, তবে আমার কষ্ট সার্থক হচ্ছে বলে মনে করি। আর একটি কথা। আপনাদের মতামত, অভিমত কিংবা সি নিয়ে যেকোন সমস্যা আমার সাথে শেয়ার করুন।
চাইলে আমাকে email ও করতে পারেন এই ঠিকানায়ঃ [email protected]
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 1)
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 2)
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 3)
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 4)
ধাপে ধাপে সি ল্যাঙ্গুয়েজ শিখুন(Part 5)
আমি বাকের। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 14 বছর 10 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 12 টি টিউন ও 81 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।
খুবই গুরুত্বপুর্ন বিষয় নিয়ে আলোচনা করেছেন।
অনেক অনেক ধন্যবাদ নিয়মিত চালিয়ে যাওয়ার জন্য।