রবিবার, ১৭ জুলাই, ২০১৬

রিকার্শন -> দ্বিতীয় কিস্তিঃ ..........


আজ বলার চেষ্টা করবো রিকার্সিভ ফাংশন কিভাবে লিখতে হয়।

"ফাংশন লেখা তো এক্কেবারে সোজা একটা ব্যাপার, দুড়ুম দাড়াম করে ফাংশনের নাম, রিটার্ন টাইপ আর ভেতরে কলকব্জা গুলো লাগায় দিয়ে রিটার্ন স্টেটমেন্ট লিখে দিলেই হইলো, এ আবার আলাদা কি !!"

হুম্ম ভাই, একটু আলাদাই, কারণ এই জিনিস টা যে "রিকার্সিভ" ;)
আপনাকে একটু স্পেশ্যাল কেয়ার নিতেই হবে, নয়তো আপনার প্রোগ্রাম হয়ে যাবে দড়ি ছিঁড়ে পালানো দুষ্টু গরুর মতো, যার শেষ অবস্থান খোয়াড়ে।

আগেই জানেন যে রিকার্সিভ ফাংশনের এক ( বা একাধিক ! ) বেজ কেস থাকে, যেখানে পৌঁছালে আরো গভীরে না যেয়ে সরাসরী কোনো কিছু রিটার্ন করে দেওয়া যায়। ফাংশন বডির শুরুতেই এই বেজ কেসের ব্যাপার টা হ্যান্ডেল করতে করে নেবেন। তা না করলে "আজীবন" ধরে আপনার প্রোগ্রাম থামার কোনো কারণ পাবে না, ( ক্রাশ করার আগ পর্যন্ত :/ )

ধরা যাক আপনি আপনি Fibonacci সিরিজ এর n তম পদ  টা বের করার জন্যে একটা রিকার্সিভ ফাংশন লিখবেন। এইটার বেজ কেস হইলো যদি n এর মান 1 বা 2 হয় তাহলে সরাসরী এন্সার হলো 1 ।
তাহলে ফাংশন বডির শুরুতেই লিখবেন if(n == 1 || n  == 2) return 1;
আবার ফ্যাক্টরিয়াল বের করার বেজ কেস হলো যদি n এর মান 0 হয় তবে সরাসরী সেটার এন্সার 1. তাহলে ফাংশন বডির শুরুতেই লিখবেন
if(n == 0) return 1;
ডায়নামিক প্রোগ্রামিং যদি রিকার্শন দিয়ে করেন সেক্ষেত্রে সাধারণত বেজ কেস হয় কোনো একটা স্টেটে আপনি আগে এসেছেন কিনা সেটা চেক করা। যদি আগে এসে থাকেন তবে সেই স্টেটের ভ্যালু আবার ক্যালকুলেশন না করে সরাসরী আগের সেভ করা জায়গা থেকে রিটার্ন করিয়ে দেওয়া যায়।
এটাই রিকার্সিভ ডায়নামিকের বেজ কেস। [ শাফায়েত ভাইয়ের ব্লগ থেকে ডায়নামিক প্রোগ্রামিং দেখতে পারেন ]

যাই হোক, বেজ কেসের কথা গেলো।

এবার আসলো ফাংশনের বাকি বডি লেখার পালা।
এবার আপনাকে একটু স্বার্থপরের মতো চিন্তা করতে হবে।

প্রথম কিস্তিতে বলেছিলাম আপনার উপরে অর্পিত কাজ টাকে আপনার ক্ষমতা যতোটুকু, ততোটুকু আপনার কাছে রেখে বাকি টুকু নতুন একটা "আপনি" তৈরী করে তাকে করতে দেওয়া।
স্বার্থপরের মতো চিন্তা করতে এইজন্যে বলছি যে ফাংশন বডি লেখার সময় আপনার ভাবা লাগবেনা যে আপনার অন্য "আমি" রা কিভাবে কাজ করবে, আপনি শুধু নিজের কথা ভাববেন আপনি কিভাবে আপনার কাজ টা করবেন, অর্থাৎ আপনি এখন যে ফাংশনের বডি টা লিখছেন, সে কিভাবে কাজ করবে আর কখন আরেকটা "নিজেকে" তৈরী করে তাকে কাজ গছিয়ে দিবে, আর সব শেষে কিভাবে নিজের "অন্য" কপি গুলো থেকে পাওয়া কাজের রেজাল্ট কে নিজের কাজের রেজাল্টের সাথে মার্জ করে ফাইনাল একটা রেজাল্ট রিটার্ণ করিয়ে দিবে, এগুলো ভাবলেই হচ্ছে।
যেমন Fibonacci সিরিজের n তম পদ বের করতে____
int fib(int n)
{
if(n == 1 || n == 2) return 1;
else return fib(n - 1) + fib(n - 2);
}
এখানে আপনার ভাবার দরকার নেই যে পরে যে দুটো  fib কে কল করেছেন তারা কিভাবে কাজ করবে।
জাস্ট লিখে ফেলেন :)

সুতরাং, রিকার্সিভ ফাংশন লেখার মোটামুটি ৩টা ধাপ পেলাম আমরা...
১) সবার আগে বেজ কেস হ্যান্ডেল করা।
২) ফাংশনের ওয়ার্কিং কলকব্জা লেখা
৩) নিজের তৈরী করা নিজের অন্যান্য কপি থেকে প্রাপ্ত রেজাল্ট কে নিজের সাথে মার্জ করে একটা ফাইনাল রেজাল্ট রিটার্ন করে দেওয়া।

খুব ভালো হয় যদি আপনি শাফায়েত ভাইয়ের ব্লগ থেকে কয়েন চেঞ্জ শিখেন। রিকার্শনের সাথে ডায়নামিক ফ্রী ;)



মূল পোস্ট ছিলো এখানে...

রিকার্শন প্রথম কিস্তি এখানে...

শাফায়েত ভাইয়ের কয়েন চেঞ্জ এখানে :)

শাফায়েত ভাইয়ের এলগরিদম ব্লগ :)

1 টি মন্তব্য: